LicenseChecker checkAccess泄漏ServiceConnection

时间:2012-08-16 17:58:40

标签: android google-play android-lvl serviceconnection

每次按下我的应用中的Back按钮,我都会在LogCat中收到此异常:

  

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()

我还检查了onDestroy()中的LicenseChecker.java,而 正在调用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();
}

那么,究竟发生了什么?

这是LVL中的错误吗?

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

刚刚放

mChecker.onDestroy();

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

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

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

答案 3 :(得分:0)

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