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