android - LicenseChecker checkAccess gotea ServiceConnection
google-play android-lvl (4)
Estoy recibiendo esta excepción en LogCat cada vez que presiono el botón Back
en mi aplicación:
La actividad ha filtrado ServiceConnection com.android.vending.licensing.LicenseChecker@471cc039 que originalmente estaba enlazada aquí
El código responsable de esta filtración en onCreate()
es:
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
mChecker.checkAccess(mLicenseCheckerCallback);
¿Cómo me deshago de esta fuga?
Intenté no asignar MyLicenseCheckerCallback a un miembro, pensando que quizás cuando la actividad continúa onPause()
la referencia a la devolución de llamada es responsable de la fuga:
mChecker.checkAccess(new MyLicenseCheckerCallback());
Pero eso no se libró de la fuga.
Actualización: Gracias al comentario de @ zapl a continuación, miré el LicenseChecker.java
de Google:
/** 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;
}
}
Al principio pensé que podría estar descuidando la llamada, pero lo comprobé dos mChecker.onDestroy();
y llamé a mChecker.onDestroy();
en mi actividad onDestroy()
.
También verifiqué onDestroy()
en LicenseChecker.java
y está llamando a 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();
}
¿Entónces, qué está sucediendo realmente?
¿Es este un error en LVL?
Acabo de tener el mismo problema, y con su actualización y el comentario de zapl me di cuenta de que el problema es el emulador que está utilizando.
Estos emuladores no tienen las API de Google Play, y el LVL no puede vincularse al servicio, dejando una conexión abierta, al final el LVL no puede cerrarlo con la llamada onDestroy.
Simplemente cree un nuevo AVD utilizando las API de Google en lugar de Android xx e intente su código allí, si no encuentra las API de Google en el menú desplegable Target al crear el nuevo AVD, descárguelo con el Android SDK Manager.
No sé sobre el LicenceChecker de Google, pero debe llamar a StopService () antes de salir de la Actividad, de lo contrario, el servicio todavía se está ejecutando y pierde memoria.
Sólo hay que poner
mChecker.onDestroy();
en su método onDestroy
de la actividad que declara y utiliza el mChecker.
Mientras que el código de Google en LicenceChecker
ve así:
public synchronized void onDestroy() {
cleanupService();
mHandler.getLooper().quit();
}
También me encontré con el mismo problema más tarde, llegué a saber que no he agregado el permiso de android com.android.vending.CHECK_LICENSE. Después de corregir esto, mi problema ahora está resuelto. Intenta añadir esta línea a tu manifiesto de Android.
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />