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();
    }
Другие вопросы по тегам