Android LicenseChecker检查访问泄漏服务连接

Android LicenseChecker检查访问泄漏服务连接,android,google-play,android-lvl,serviceconnection,Android,Google Play,Android Lvl,Serviceconnection,每次我按下应用程序中的后退按钮时,我都会在LogCat中收到此异常: 活动已泄漏ServiceConnection com.android.vending.licensing。LicenseChecker@471cc039那是 原订于此 onCreate()中导致此泄漏的代码是: mLicenseCheckerCallback = new MyLicenseCheckerCallback(); mChecker.checkAccess(mLicenseCheckerCallback); 我该如

每次我按下应用程序中的
后退按钮时,我都会在LogCat中收到此异常:

活动已泄漏ServiceConnection com.android.vending.licensing。LicenseChecker@471cc039那是 原订于此

onCreate()
中导致此泄漏的代码是:

mLicenseCheckerCallback = new MyLicenseCheckerCallback();
mChecker.checkAccess(mLicenseCheckerCallback);
我该如何处理这个漏洞

我尝试不将MyLicenseCheckerCallback分配给成员,我认为可能是当活动进入
onPause()
时,对回调的引用导致了泄漏:

mChecker.checkAccess(new MyLicenseCheckerCallback());
但这并没有消除漏洞

更新:感谢@zapl在下面的评论,我查看了谷歌的
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.
 * <p>
 * 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();
}
/**
*通知库上下文即将被销毁,以便
*可以清理任何打开的连接。
*
*未能调用此方法可能会在某些情况下导致崩溃
*情况,例如在屏幕旋转期间,如果活动请求
*许可证检查或用户退出应用程序时。
*/
公共同步的void ondestory(){
cleanupService();
mHandler.getLooper().quit();
}
那么,到底发生了什么

这是LVL中的一个bug吗?

刚刚放好

mChecker.onDestroy();
在声明和使用mChecker的活动的
onDestroy
方法上

而谷歌在
LicenseChecker
中的代码如下所示:

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

我也遇到了同样的问题,后来我才知道我没有添加安卓权限com.android.vending.CHECK_许可证。纠正这个错误后,我的问题现在解决了。尝试将这一行添加到您的android清单中

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />


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

我刚刚遇到了同样的问题,根据你的更新和zapl的评论,我发现问题出在你使用的模拟器上

这个模拟器没有Google Play API,LVL不能绑定到服务,留下一个打开的连接,最后LVL不能通过onDestroy调用关闭它


创建新的AVD时,如果在目标下拉列表中找不到谷歌API,只需使用谷歌API而不是Android x.x创建一个新的AVD,然后在那里尝试您的代码。使用Android SDK管理器下载它。

有一些
上下文35; bindService()
调用,但没有相应的代码。您(或您正在使用的代码)必须在销毁活动实例之前解除服务绑定,以防止该消息。如果你泄漏连接,它不会使你的应用程序崩溃though@zapl谢谢是的,我知道那个应用程序不会崩溃,但在我的代码中有这样的东西让我很烦恼。问题是我没有创建这个服务,这是谷歌提供的服务。你有没有在
onPause()
中尝试将
mlicecheckercallback
mChecker
设置为空?“我仔细检查并在我的活动的
ondestory()
”中调用
mChecker.ondestory();
,并确保您正确拼写许可证。有个S,不像我有个C。啊!这就是我在华为P40上遇到的问题。