ServiceConnectionLeaked en Android
Estoy intentando utilizar un servicio en Android para algunas operaciones básicas de la base de datos, pero por alguna razón estoy consiguiendo una actividad se ha filtrado el error de ServiceConnection. Publicaré la lectura completa de Logcat en la parte inferior.
Tengo que usar el mismo servicio en múltiples actividades, así que he creado una superclase para manejar todas las tareas de servicio. Se parece a esto:
- ¿Cuándo se destruye un servicio iniciado y enlazado?
- ¿Cómo puedo llamar a startIntentSenderForResult en el servicio correctamente?
- Suscripción o vinculación a un servicio de Intent existente
- ¿Cómo ejecutar una aplicación Android en segundo plano?
- ¿Debo hacer el trabajo en un hilo separado si mi aplicación Android no tiene interfaz de usuario?
private MyInterface child; public void onCreate(Bundle savedInstanceState, MyInterface child){ super.onCreate(savedInstanceState); doBindService(); } public void onResume(){ super.onResume(); doBindService(); } protected void onPause(){ super.onPause(); doUnbindService(); } private boolean bound; private boolean binding; ServiceConnection Connection = new ServiceConnection(){ //called when the service is connected @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(LOGTAG, "Bound to Service"); bound = true; binding = false; toServiceMessenger = new Messenger(service); while(!commandsForService.isEmpty()){ sendToService(commandsForService.poll()); } } //called when the service is disconnected @Override public void onServiceDisconnected(ComponentName name) { Log.d(LOGTAG, "Unboud from Service"); bound = false; binding = false; toServiceMessenger = null; } }; private boolean doBindService(){ Log.d(LOGTAG, "Attempting to Bind to Service"); if(!bound && !binding){ binding = true; bindService(new Intent(this, global.FetchService.class), Connection, Context.BIND_AUTO_CREATE); } return bound; } private void doUnbindService(){ Log.d(LOGTAG, "Attempting to Unbind from Service"); if(bound && !binding){ binding = true; unbindService(Connection); } } public void sendToService(Message msg){ if(bound){ sendMessageToService(msg); } else{ commandsForService.add(msg); } } private void sendMessageToService(Message msg){ if(bound){ msg.replyTo = fromServiceMessenger; try { toServiceMessenger.send(msg); } catch (RemoteException e) { Log.d(LOGTAG, "RemoteException communicating with service"); } } else{ Log.d(LOGTAG, "Error: toServiceMessenger null while bound"); } }
La idea es que la actividad del niño nunca tendrá que preocuparse de estar conectado al servicio o no, la Superclase debe hacerse cargo de obtener los datos del servicio y volver al niño.
Los puntos de Logcat doBindService () en onCreate () -> bindService (new Intent (this, global.FetchService.class), Connection, Context.BIND_AUTO_CREATE); Como la línea que causa el error. Sin embargo, el servicio sólo se pierde después de que la actividad se ha estado ejecutando y visible durante más de 15 segundos, así que no creo que onCreate () debería haber sido llamado.
Aquí está el Logcat:
09-02 09:25:40.635: E/ActivityThread(5963): Activity childActivity has leaked ServiceConnection superClass$1@42cb1b70 that was originally bound here 09-02 09:25:40.635: E/ActivityThread(5963): android.app.ServiceConnectionLeaked: Activity childActivity has leaked ServiceConnection superClass$1@42cb1b70 that was originally bound here 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1055) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:949) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ContextImpl.bindService(ContextImpl.java:1472) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ContextImpl.bindService(ContextImpl.java:1464) 09-02 09:25:40.635: E/ActivityThread(5963): at android.content.ContextWrapper.bindService(ContextWrapper.java:394) 09-02 09:25:40.635: E/ActivityThread(5963): at superClass.doBindService(FetchActivity.java:253) 09-02 09:25:40.635: E/ActivityThread(5963): at superClass.onCreate(FetchActivity.java:61) 09-02 09:25:40.635: E/ActivityThread(5963): at childActivity.onCreate(Showcase_Activity.java:37) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.Activity.performCreate(Activity.java:5066) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.access$600(ActivityThread.java:151) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335) 09-02 09:25:40.635: E/ActivityThread(5963): at android.os.Handler.dispatchMessage(Handler.java:99) 09-02 09:25:40.635: E/ActivityThread(5963): at android.os.Looper.loop(Looper.java:155) 09-02 09:25:40.635: E/ActivityThread(5963): at android.app.ActivityThread.main(ActivityThread.java:5493) 09-02 09:25:40.635: E/ActivityThread(5963): at java.lang.reflect.Method.invokeNative(Native Method) 09-02 09:25:40.635: E/ActivityThread(5963): at java.lang.reflect.Method.invoke(Method.java:511) 09-02 09:25:40.635: E/ActivityThread(5963): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 09-02 09:25:40.635: E/ActivityThread(5963): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795) 09-02 09:25:40.635: E/ActivityThread(5963): at dalvik.system.NativeStart.main(Native Method)
Cualquier ayuda será apreciada.
- ¿Puede iniciar un IntentService en un proceso separado?
- Notificación de IntentService - NullPointerException mientras obtiene Context
- Firebase + Android - Notificaciones ChildAdded - ¿Cómo obtener sólo New Childs?
- Práctica recomendada: servicio vinculante a una actividad
- Android: escucha los mensajes SMS entrantes
- No se puede solucionar la excepción MediaController.show ()
- ¿Vincular el servicio a la actividad o fragmento?
- Detectando Android L Battery Saver
Como se llama a doBindService()
en el onCreate()
, debe agregar el hacer UnbindService()
en onDestroy()
.
Esto funciona para mi.
Estás llamando a doBindService()
en onCreate()
y onResume()
, intentando llamar a just onResume()
para hacer coincidir tu llamada a doUnbindService()
en onPause()
Es necesario utilizar la referencia buena para la actividad getActivity () devolver el actual, y es necesario desvincular en el que hizo el enlace
He aquí cómo solucioné el problema:
private Activity mActivity; @Override public void onStart() { super.onStart(); if (!mBound) { startService(); mActivity = getActivity(); } } @Override public void onStop() { super.onStop(); if (mBound && mActivity != null) { mActivity.unbindService(mServiceConnection); mActivity = null; } }
Está recibiendo este error porque el servicio que vincula con la actividad no se detiene cuando esa actividad se destruye. Así que debido a esto su servicio todavía existe en la memoria y el consumo de recursos, que no está haciendo nada.
Para resolver este problema, llame a doBindService()
en onCreate()
y doUnbindService()
en onDestroy()
- La compilación de CLI de Android muestra un error de nombre de directorio de recursos no válido: MY_PROJECT \ res / crunch
- Selector de selección de texto de Android