2014-09-29 18 views
7

Występuje częsta awaria z poniższym logiem. Nie odwołuje się do mojego kodu aplikacji, ale domyślam się, że może to mieć coś wspólnego z łączeniem/rozłączaniem GoogleApiClient. Czy ktoś ma coś podobnego do tego? Nie byłem w stanie znaleźć niczego tutaj.DeadObjectException z com.google.android.gms

java.lang.IllegalStateException: android.os.DeadObjectException 
    at com.google.android.gms.internal.ao.removeAllListeners(Unknown Source) 
    at com.google.android.gms.internal.ap.disconnect(Unknown Source) 
    at com.google.android.gms.common.api.b.n(Unknown Source) 
    at com.google.android.gms.common.api.b.a(Unknown Source) 
    at com.google.android.gms.common.api.b$2.onConnectionSuspended(Unknown Source) 
    at com.google.android.gms.internal.r.y(Unknown Source) 
    at com.google.android.gms.internal.q$a.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5102) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.os.DeadObjectException 
    at android.os.BinderProxy.transact(Native Method) 
    at com.google.android.gms.internal.an$a$a.a(Unknown Source) 
    ... 15 more 

Prawdopodobnie, gdzie to się dzieje. Dodałem try/catch złapać wyjątek

mGApiClientMgr.addTask(mGApiClientMgr.new GoogleApiClientTask() { 
      @Override 
      public void run() { 
       Log.d(LOG_TAG, "Refreshing data set."); 
       Location location; 
       try { 
        location = LocationServices.FusedLocationApi.getLastLocation(getGoogleApiClient()); 
        onLocationChanged(location); 
       } 
       catch(IllegalStateException ex) { 
        // TODO 
       } 
      } 
     }); 

gdzie addTask robi:

private final LinkedBlockingQueue<GoogleApiClientTask> mTaskQueue = new LinkedBlockingQueue 
     <GoogleApiClientTask>(); 

    mTaskQueue.offer(task); 
+0

możesz wyświetlić fragment kodu swoich słuchaczy GMS – ashoke

+0

Sprawdź edycję. – ono

+0

To jest najbliższa rzecz, którą znalazłem http://stackoverflow.com/questions/24288685/deadobjectexception-in-gmslocationclient-android – ono

Odpowiedz

5

Wydaje związane z obsługą i przekazywanie komunikatów ... Na podstawie poniżej urywek ze swojego śladu stosu, gms jest widząc DeadObjectException, gdy próbuję process a message na looper. Nawet jeśli ślad stosu pokazuje gms powiązane, mógł zostać wywołany przez twój kod.

at com.google.android.gms.internal.q$a.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 

Wyjątek ten jest postrzegany jeśli message jego próby dostępu należeć do procesu, który ma od wyszedł/zabity. Wykonaj wyszukiwanie kodu dla wszystkich handler sendMessage* message dispatch calls, korzystając z kodu. Nawet to może nie przechwycić wszystkich wystąpień, ponieważ niektóre wywołania mogą spowodować wysłanie wiadomości.

Sprawdź również, czy któreś z usług w tle lub działania, które przydzieliły komunikaty handler, wychodzą. Android może je zniszczyć: depending on life cycle states, try overriding onDestroy.

We wszystkich swoich działaniach/usługach, gdziekolwiek nawiążesz połączenia z gms api, sprawdź utworzone obiekty i przekaż je pod numer gms; Jeśli umrą, te obiekty już nie będą ważne.

+0

Dzięki za te informacje. Zakładając, że powoduje to "sendMessage", czy mogę po prostu owinąć każdego z nich próbując złapać wyjątek IllegalStateException? – ono

+0

który nie pomoże, ponieważ 'sendMessage' po prostu przekaże obiekt do kolejki komunikatów i zwróci. Wyjątek ma miejsce znacznie później, gdy 'gms' pociągnie obiekt z kolejki komunikatów. Oznacza to, że nadawca mógł wyjść lub zabić przez cykl życia Androida. upewnij się, że przydzielasz obiekt do wyższego zakresu lub sprawdź, czy możesz go zachować. – ashoke

+0

Potencjalnym rozwiązaniem jest wykrycie, które działanie zostało zniszczone, które jest powiązane z obiektem przekazanym między działaniem a usługą za pośrednictwem modułu obsługi. Lub zidentyfikować usługę, która jest jego przyczyną i zatrzymać usługę po zniszczeniu działania. Czy to jest sposób, aby o tym poradzić? – ono

Powiązane problemy