można użyć usługi (najlepiej usługi na pierwszym planie), która nasłuchuje dzienników (za pomocą wątku), a jeśli jest dziennik wskazujący ANR, należy go obsłużyć.
oto mała próbka aplikacji, która powoduje ANR:
...
findViewById(R.id.button).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(final View v)
{
try
{
Thread.sleep(10000);
}
catch(final InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
...
Oto dziennik, który dostałem od LogCat kiedy mam ANR:
08-03 13:02:37.746: E/ActivityManager(158): ANR in com.example.anr (com.example.anr/.MainActivity)
08-03 13:02:37.746: E/ActivityManager(158): Reason: keyDispatchingTimedOut
08-03 13:02:37.746: E/ActivityManager(158): Load: 6.19/2.37/0.86
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 5598ms to 0ms ago:
08-03 13:02:37.746: E/ActivityManager(158): 2.6% 158/system_server: 2.5% user + 0.1% kernel/faults: 86 minor
08-03 13:02:37.746: E/ActivityManager(158): 0.5% 298/com.android.phone: 0.3% user + 0.1% kernel/faults: 15 minor
08-03 13:02:37.746: E/ActivityManager(158): 0% 35/rild: 0% user + 0% kernel
08-03 13:02:37.746: E/ActivityManager(158): 4.6% TOTAL: 3.9% user + 0.6% kernel
08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 2029ms to 2654ms later:
08-03 13:02:37.746: E/ActivityManager(158): 11% 158/system_server: 4.8% user + 6.4% kernel/faults: 2 minor
08-03 13:02:37.746: E/ActivityManager(158): 11% 192/InputDispatcher: 4.8% user + 6.4% kernel
08-03 13:02:37.746: E/ActivityManager(158): 1.6% 163/Compiler: 1.6% user + 0% kernel
08-03 13:02:37.746: E/ActivityManager(158): 1.6% 193/InputReader: 0% user + 1.6% kernel
08-03 13:02:37.746: E/ActivityManager(158): 18% TOTAL: 9.3% user + 9.3% kernel
tak, tak myślę to jest możliwe.
@ DarrenFaith Dude. O czym mówisz? Akceptuję zadowalające odpowiedzi. Jeśli ktoś odpowie, ale tak naprawdę nie odpowiada na pytanie, nie akceptuję ich. Większość moich pytań jest * naprawdę * trudna lub nie ma odpowiedzi. Zwykle do czasu, kiedy pytam, bardzo dużo szukałem, a jeśli to jest pytanie na Androida i nie mogę znaleźć odpowiedzi samemu, to będzie to * naprawdę trudne * pytanie. Mój przedstawiciel 2K odpowiada na pytania. Jeśli moja aplikacja jest dostępna na rynku, widzę zamrożenie. Ohyda. Chcę je złapać. –
@WarrenFaith PS. Jeśli możesz mi powiedzieć, jak złapać ANR, obiecuję, że twoja odpowiedź zostanie przyjęta. Sądząc po twoim "Jeśli twoja aplikacja jest na rynku ...", nie wiesz jak, więc jeśli odpowiesz, nie będę" akceptował "tego, ponieważ nie jest to odpowiedź, czy raczej powinienem zaakceptować to tylko dlatego, że to napisałeś? –
@WarrenFaith PPS , jeśli odpowiedź brzmi "nie możesz tego zrobić", powinieneś cytować źródło z linkiem, inaczej jest to tylko domysły –