2014-09-29 23 views
7

Si verifica un arresto frequente con il registro di seguito. Non fa riferimento al mio codice di applicazione, ma suppongo che possa avere qualcosa a che fare con GoogleApiClient che si connette/disconnette. Qualcuno ha qualcosa di simile a questo? Non sono stato in grado di trovare nulla qui.DeadObjectException con 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 

Forse dove sta accadendo. Ho aggiunto un try/catch per intercettare l'eccezione

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

dove addTask fa:

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

    mTaskQueue.offer(task); 
+0

puoi mostrare lo snippet di codice dei tuoi ascoltatori gms – ashoke

+0

Controlla la modifica. – ono

+0

Questa è la cosa più vicina che ho trovato http://stackoverflow.com/questions/24288685/deadobjectexception-in-gmslocationclient-android – ono

risposta

5

Questo sembra relative ai gestori e il messaggio che passa ... Sulla base di sotto frammento dalla traccia dello stack, è gms vedere un DeadObjectException quando si prova a process a message sul looper. Anche se la traccia dello stack mostra gms correlati, potrebbe essere stata attivata dal codice.

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) 

Questa eccezione si vede se il message il suo tentativo di accesso appartengono a un processo che ha dato uscito/ucciso. Fai una ricerca di codice per tutti handler sendMessage* message dispatch calls, attraverso il tuo codice. Anche questo potrebbe non essere in grado di catturare tutte le istanze poiché alcune chiamate gms potrebbero dare come risultato le spedizioni di messaggi handler.

Verificare inoltre se uno qualsiasi dei servizi in background o le attività che hanno assegnato i messaggi handler sono in uscita. Android potrebbe distruggerli depending on life cycle states, try overriding onDestroy.

In tutte le attività/servizi, in qualsiasi posto in cui si effettuano chiamate all'API gms, controllare gli oggetti creati e passati a gms; Se muoiono, quegli oggetti non sono più validi.

+0

Grazie per queste informazioni. Supponendo che "sendMessage" lo stia causando, posso semplicemente racchiudere ognuno di essi con un try-catch per catturare l'IllegalStateException? – ono

+0

che non aiuta come 'sendMessage' sta per consegnare l'oggetto alla coda dei messaggi e ritornare. L'eccezione si verifica in un momento successivo, quando 'gms' estrae l'oggetto dalla coda dei messaggi. Nel frattempo, il mittente potrebbe essere uscito o ucciso dal ciclo di vita di Android. assicurati di allocare un oggetto su un ambito più alto o vedere se riesci a conservarlo. – ashoke

+0

Una possibile soluzione consiste nel rilevare quale attività è stata distrutta correlata all'oggetto passato tra l'attività e il servizio tramite un gestore. O identificare il servizio che lo sta causando e interrompere il servizio quando l'attività viene distrutta. È questo il modo di farlo? – ono

Problemi correlati