2014-10-19 8 views
15

Proces ten jest błędem nie wydaje się być bardzo dobrze udokumentowany, a ja tylko udało mi się znaleźć obejścia. Zamiast tego interesuje mnie przyczyna tego błędu i jak temu zapobiec, a nie jak ręcznie obsłużyć go poprzez ponowne uruchomienie, ponowne uruchomienie aplikacji, itp.Zapobieganie procesowi "proces jest zły" błędu

Moja szczególna aplikacja używa Menedżera alarmów do uruchomienia usługi IntentService, która działa dla ~ 10 s co ~ 30s. Nazywa się to przy tworzeniu aplikacji:

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

Działa to zgodnie z oczekiwaniami przez większość czasu. Jednak bardzo rzadko usługa nie uruchomi się na czas nieokreślony, czasami po kilka godzin. Poniższy błąd występuje co ~ 30 s, więc wiem, że moje alarmy próbują uruchomić IntentService zgodnie z harmonogramem, ale próba nie powiedzie się, gdy proces jest błędny.

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

Naprawiono to po prostu ponownie otwierając aplikację. Ale muszę wiedzieć, jak temu zapobiec! Celem tej usługi jest uruchamianie w tle, gdy działania są zatrzymywane lub niszczone, więc musi zapobiegać temu błędowi bez interwencji użytkownika lub obejścia.

+1

Czy w usłudze jest jakaś zmienna statyczna? – Rahul

+0

Nie jestem pewien, nie dotknąłem kodu od lat i nie mam już do niego dostępu. Ale prawdopodobnie tak. Dlaczego? – tep

Odpowiedz

1

Szansa na to, że ma to związek z obsługą cyklu życia aktywności.

Przypomina mi sprawę, którą ostatnio rozwiązałem bez pełnego zrozumienia, ponieważ dokumentacja nie jest bardzo szczegółowa na tym, na czym możesz polegać po wywołaniu funkcji onStop() w Twojej Działalności. I co dokładnie nie należy robić ...

Więc mogę tylko podać kilka wskazówek:

Jeśli moje przypuszczenie jest słuszne, masz problem z nie jest prawidłowo przywrócone, gdy aplikacja jest (częściowo) usunięte z pamięci. Spróbuj ustawić limit dla aplikacji w tle w ustawieniach programisty na "brak". Podejrzewam, że przy tym ustawieniu problem będzie całkowicie odtwarzalny podczas umieszczania go w tle. W przeciwnym razie prawdopodobnie możesz przestać czytać tutaj.

Miałem wątek, który kontynuował działanie po onStop(), który również zachowywał pewne odniesienia. Zatrzymanie wątku w trybie onPause(), a także oczekiwanie na to, że finshsh rozwiązał mój problem. Potrzebowałem również zsynchronizować mój onStop(), ponieważ blokowanie onPause() spowodowało, że onStop() nadchodzi równolegle. Musiałem również przenieść część mojej initilization z onCreate() do onResume(). Ale było to dość oczywiste, gdy zorientowałem się, co zburzyć w onResume() i onStop().

Prawdopodobnie tipp ze statycznym idzie w tym samym kierunku.

+0

Dzięki za napiwek, nie jestem już właścicielem tego kodu i nie mogę go zweryfikować, ale mam nadzieję, że jest to przydatne dla kogoś innego w tym samym wydaniu! – tep

Powiązane problemy