2014-10-19 4 views
15

Il processo è un errore errato non sembra essere molto ben documentato e sono riuscito solo a trovare soluzioni alternative. Sono invece interessato alla causa di questo errore e di come impedirlo e non a gestirlo manualmente tramite il riavvio, il riavvio dell'app, ecc.Impedisci l'errore di "processo errato" Android

La mia particolare applicazione utilizza un AlarmManager per avviare un IntentService che viene eseguito per ~ 10 s ogni ~ 30 s. Questo viene chiamato alla creazione dell'applicazione:

Intent serviceIntent = new Intent(appContext, MyService.class); 
    serviceIntent.putExtra("service_extra", extra); 
    launchService = PendingIntent.getService(
      appContext, 
      LAUNCH_SERVICE_REQUEST_CODE, 
      scanIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT 
    ); 
    alarmManager.setInexactRepeating(
      AlarmManager.RTC, 
      System.currentTimeMillis() + interval, 
      interval, 
      launchService 
    ); 

Questo funziona come previsto per la maggior parte del tempo. Tuttavia, molto raramente il servizio non verrà avviato per un periodo indefinito, a volte ore alla volta. Il seguente errore viene visualizzato ogni ~ 30 secondi, quindi so che i miei allarmi stanno tentando di avviare IntentService come pianificato, ma il tentativo non riesce con un processo è un errore grave.

Unable to launch app com.example.android/10024 for service Intent { cmp=com.example.android/.MyService (has extras) }: process is bad 

Ciò viene risolto semplicemente riaprendo l'app. Ma ho bisogno di sapere come prevenirlo! Lo scopo di questo servizio è quello di essere eseguito in background mentre le attività vengono interrotte o distrutte, quindi è necessario prevenire questo errore senza alcuna interazione o soluzione da parte dell'utente.

+1

C'è qualche variabile statica nel tuo servizio? – Rahul

+0

Non sono sicuro, non ho toccato il codice in anni e non ho più accesso. Ma probabilmente sì. Come mai? – tep

risposta

1

La buona probabilità è che ha a che fare con la gestione del ciclo di vita dell'attività.

Mi ricorda un caso che ho risolto di recente senza comprenderlo completamente perché la documentazione non è molto specifica su ciò su cui è possibile fare affidamento dopo che onStop() viene richiamato sull'attività. E che cosa esattamente non si dovrebbe fare ...

Quindi posso solo dare alcuni suggerimenti:

Se la mia ipotesi è giusta, avete problema con non essere correttamente ripristinato, quando la vostra applicazione è (parzialmente) rimosso dalla memoria. Prova a impostare il limite per le app in background nelle impostazioni sviluppatore su "none". Sospetto che con questa impostazione il tuo problema sarà completamente riproducibile quando lo metti sullo sfondo. Altrimenti probabilmente puoi smettere di leggere qui.

Avevo un thread che continuava a funzionare dopo onStop() che manteneva anche alcuni riferimenti. Fermare il thread in onPause() e anche aspettare che finsh risolva il mio problema. Avevo anche bisogno di sincronizzare il mio onStop() perché il blocco onPause() ha provocato l'ingresso di onStop() in paralell. Avevo anche bisogno di spostare parte della mia inizializzazione da onCreate() a onResume(). Ma questo era abbastanza ovvio quando ho capito cosa abbattere su onResume() e onStop().

Probabilmente il tipp con la statica va nella stessa direzione.

+0

Grazie per il suggerimento, non possiedo più questo codice e non riesco a verificare, ma spero che questo sia utile a qualcun altro con lo stesso problema! – tep