LicenseChecker的checkAccess泄漏ServiceConnection(Lice

2019-06-27 02:36发布

我收到此异常的logcat我每次按时间Back我的应用程序按钮:

活动已泄漏,最初这里必然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()

我还检查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的错误吗?

Answer 1:

我刚刚得到了同样的问题,并与您的更新和zapl的评论我想通了,这个问题是您正在使用的仿真器。

该仿真器不具备的谷歌游戏的API,以及LVL不能绑定到服务,留下连接打开,在年底LVL不能用的onDestroy调用关闭它。

只是使用谷歌的API,而不是Android的XX的创建一个新的AVD,并尝试你的代码在那里,如果你鸵鸟政策创建新的AVD在Android SDK管理器下载它,当发现目标下拉了谷歌的API。



Answer 2:

我也后来遇到了同样的问题我知道,我没有带补充说,Android的许可com.android.vending.CHECK_LICENSE。 纠正这个我是问题后,现在已经解决了。 尝试加入这一行你的Android清单

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


Answer 3:

只要把

mChecker.onDestroy();

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

虽然谷歌在代码LicenceChecker看起来是这样的:

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


Answer 4:

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



文章来源: LicenseChecker checkAccess leaks ServiceConnection