2013-09-02 14 views
8

Bazı temel veritabanı işlemleri için Android'de bir Hizmet kullanmaya çalışıyorum, ancak bir nedene göre bir ServiceConnection hatası sızdı. Alttaki tam Logcat okumayı göndereceğim.ServiceConnectionLeaked Android

Aynı hizmeti birden çok etkinlikte kullanmam gerekiyor, bu nedenle tüm hizmet görevlerini yerine getirmek için bir Süper Sınıf oluşturdum. Bu şuna benzer:

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"); 
    } 
} 

fikri Üst sınıf veriler tekrar çocuğa hizmet ve almanın özen çocuk aktivite hizmet veya değil bağlanmadan dert etmenize gerek asla olmasıdır.

Logcat noktaları onCreate() içindeki doBindService() -> bindService (yeni Intent (this, global.FetchService.class), Bağlantı, Bağlam.BIND_AUTO_CREATE); hataya neden olan satır olarak. Ancak, hizmet yalnızca çalıştıktan ve 15 saniyeden daha uzun süre görüntülendikten sonra sızar, dolayısıyla onCreate() öğesinin çağrılması gerektiğini düşünmüyorum. Herhangi bir yardım büyük takdir edilecektir

09-02 09:25:40.635: E/ActivityThread(5963): Activity childActivity has leaked ServiceConnection [email protected] that was originally bound here 
09-02 09:25:40.635: E/ActivityThread(5963): android.app.ServiceConnectionLeaked: Activity childActivity has leaked ServiceConnection [email protected] 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) 

:

İşte Logcat bu. Sen onPause()

+0

mu ServiceConnectionLeaked meydana onDestroy() içinde onCreate() ve doUnbindService() bu sorunun çağrıyı doBindService() çözmek için? Log deyimlerini bindService ve unbindService sonra derlenmiş çiftler olarak çağrılıyor emin olmak için hemen koyabilirsiniz? –

+0

Belki de superUnay() yöntemini kullanarak (onPause() yönteminizde) doUnbindService() * 'i çağırmayı deneyebilirsiniz? – Ponkadoodle

cevap

9
+0

oluşturulduğunda hızlı bir şekilde bağlanmasını sağladığından emin olmak için çok uzun sürdü. Gelecekte insanlar için: çözüm, doBindService() ve doUnbindService() çağrılarının Android Activity yaşam döngüsüne yansıtılması gerektiğidir.Bir hizmete bağlanma biraz zaman alabileceğinden, onCreate() ve onDestroy() içinde yapılmalıdır. OnResume() ve onPause() 'da yaptım çünkü Android yaşam döngüsü hakkında paranoyak oldum. – MrMannWood

3

Sen akımı dönüş) (Aktivite getActivity için iyi bir başvuru kullanmanız gerekir

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; 
     } 
    } 
: bir, ve bağlama burada

yaptığı birinde unbind gerekir sorunu sabit nasıl

'u onCreate() numaralı telefondan aradığınızda onDestroy() numaralı telefona UnbindService() numarasını eklemelisiniz.

Benim için çalışıyor.

+0

Bunu denedim ve işe yaramadı, Logcat şimdi onResume() içindeki doBindService'i işaret ediyor. Booleanların aramanın her iki seferde gerçekleşmediğinden emin olması gerektiğinden, bunun bir problem olmasını beklemiyordum. doBindService, her ikisi de a) hizmetin etkinlik görünür olduğunda her zaman bağlı olduğunu ve – MrMannWood

1

yılında doUnbindService() için çağrı maç için sadece onResume() bunu çağırarak çalışırken, onCreate() ve onResume() hem doBindService() aradığınız

1

Bu hatayı alıyorsunuz, çünkü bu etkinlik yok olduğunda etkinlikle bağlandığınız hizmet durdurulmaz. Bu nedenle hizmetiniz hala bellekte ve tüketen kaynaklarda mevcut olup, hiçbir şey yapmamaktadır. Eğer childActivity ayrıldıktan sonra