19

每次按下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

4 回答 4

6

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

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

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

于 2013-10-23T07:16:54.557 回答
4

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

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
于 2012-12-15T13:19:58.413 回答
0

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

于 2012-12-15T20:31:27.893 回答
0

就放

mChecker.onDestroy();

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

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

  public synchronized void onDestroy() {
        cleanupService();
        mHandler.getLooper().quit();
    }
于 2012-10-01T21:35:58.710 回答