LicenseChecker checkAccess утечки ServiceConnection
Я получаю это исключение в LogCat каждый раз, когда нажимаю Back
кнопка в моем приложении:
Активность просочилась через 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 ответа
У меня такая же проблема, и с вашим обновлением и комментарием zapl я понял, что проблема в том, какой эмулятор вы используете.
Эти эмуляторы не имеют API Google Play, и LVL не может привязать к сервису, оставляя соединение открытым, в конце LVL не может закрыть его с помощью вызова onDestroy.
Просто создайте новый AVD, используя API Google вместо Android xx, и попробуйте там свой код, если вы не найдете API Google в раскрывающемся списке Цель при создании нового AVD, загрузите его с помощью Android SDK Manager.
Я также столкнулся с той же проблемой позже, я узнал, что я не добавил это разрешение Android com.android.vending.CHECK_LICENSE . После исправления этого моя проблема была решена. Попробуйте добавить эту строку в свой манифест Android
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
Я не знаю о Google LicenceChecker, но вы должны вызвать StopService() перед выходом из Activity, в противном случае служба все еще работает и теряет память.
Просто положи
mChecker.onDestroy();
на ваше onDestroy
метод действия, который объявляет и использует mChecker.
В то время как код Google в LicenceChecker
выглядит так:
public synchronized void onDestroy() {
cleanupService();
mHandler.getLooper().quit();
}