LicenseChecker checkAccess泄漏ServiceConnection

每次按下我的应用程序中的“ Back按钮时,我都会在LogCat中收到此exception:

Activity已泄露最初绑定的ServiceConnection com.android.vending.licensing.LicenseChecker@471cc039

onCreate()负责此泄漏的代码是:

 mLicenseCheckerCallback = new MyLicenseCheckerCallback(); mChecker.checkAccess(mLicenseCheckerCallback); 

我如何摆脱这种泄漏?

我尝试不将MyLicenseCheckerCallback分配给成员,也许在活动进行onPause() ,对回调的引用负责泄漏:

 mChecker.checkAccess(new MyLicenseCheckerCallback()); 

但这并没有摆脱泄漏。

更新:感谢@ zapl的评论,我查看了Google的LicenseChecker.java

 /** Unbinds service if necessary and removes reference to it. */ private void cleanupService() { if (mService != null) { try { mContext.unbindService(this); } catch (IllegalArgumentException e) { // Somehow we've already been unbound. This is a non-fatal error. Log.e(TAG, "Unable to unbind from licensing service (already unbound)"); } mService = null; } } 

起初我以为我可能忽略了调用它,但我仔细检查了,我正在调用mChecker.onDestroy(); 在我的活动的onDestroy()

我还检查了LicenseChecker.java onDestroy()并调用了unbindService

 /** * Inform the library that the context is about to be destroyed, so that * any open connections can be cleaned up. * 

* Failure to call this method can result in a crash under certain * circumstances, such as during screen rotation if an Activity requests * the license check or when the user exits the application. */ public synchronized void onDestroy() { cleanupService(); mHandler.getLooper().quit(); }

那么,究竟发生了什么?

这是LVL中的一个错误吗?

Solutions Collecting From Web of "LicenseChecker checkAccess泄漏ServiceConnection"

我后来也遇到了同样的问题我知道我没有添加android权限com.android.vending.CHECK_LICENSE。 纠正这个后,我的问题现在解决了。 尝试添加此行您的Android清单

  

我刚刚遇到了同样的问题,并且根据您的更新和zapl的评论,我发现问题是您正在使用的模拟器。

此仿真器没有Google Play API,并且LVL无法绑定到服务,保持连接打开,最后LVL无法通过onDestroy调用将其关闭。

只需使用Google API而不是Android xx创建新的AVD,并在那里尝试使用您的代码,如果您在使用Android SDK Manager创建新的AVD下载时未在Target下拉菜单中findGoogle API。

刚刚放

 mChecker.onDestroy(); 

在声明和使用mChecker的活动的onDestroy方法上。

虽然Google的LicenceChecker代码如下所示:

  public synchronized void onDestroy() { cleanupService(); mHandler.getLooper().quit(); } 

我不知道谷歌的LicenceChecker,但你应该在退出活动之前调用StopService(),否则服务仍在运行并泄漏内存。