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:

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.

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()

  • Servicios de Android: START_STICKY no funciona en Kitkat
  • No se puede iniciar el servicio con null
  • Cómo reiniciar el servicio en android para llamar al servicio de nuevo
  • Android Service está creando una y otra vez
  • Android Broadcast Receiver vs Servicio
  • Razones por las que la intención pasada sería NULL en onStartCommand
  • Emulador de Android: ¿Cómo puedo obtener una lista de servicios que se están ejecutando
  • Android PendingIntent Extra
  • Espera en startService antes de bindService
  • Pasando objeto personalizado al servicio android en diferentes procesos
  • Vinculación a un servicio desde otra aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.