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上遇到的问题。