Подтвердить что ты не робот

Проверка 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?

4b9b3361

Ответ 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, иначе служба все еще работает и утечка памяти.