2011-06-30 13 views
23

Czy ANR jest wyjątkiem, błędem, czy co? Czy rzeczywiście możemy go złapać w strukturze try{} catch(){}?Czy "ANR" jest wyjątkiem lub błędem, czy co?

+1

zapomniałeś wspomnieć co platforma używasz. –

+0

Poszukaj "I/Choreographer (xxx): Pominięto ramki xxx! Aplikacja może wykonywać zbyt wiele pracy nad głównym wątkiem." w twoim logcat. Może to pomóc w znalezieniu problemu. – Christ

+0

Wygląda na to, że jest "czym" – Kirby

Odpowiedz

44

ANR (Aplikacja nie odpowiada) nie jest dokładnie błędem. Jest wyświetlany, gdy aplikacja jest bardzo powolna i zajmuje dużo czasu, aby odpowiedzieć, co powoduje, że użytkownik czeka. Użytkownik nie doceni, jeśli aplikacja sprawi, że będą czekać długo. Tak więc platforma Android daje użytkownikowi opcję zamknięcia aplikacji. http://developer.android.com/guide/practices/design/responsiveness.html

Występuje, gdy wykonywane są długie operacje na głównym wątku. System nie może przetwarzać interakcji użytkownika w tym okresie, ponieważ główny wątek jest zablokowany. Rozwiązaniem jest wykonywanie ciężkich operacji w wątku roboczym i utrzymywanie głównego wątku za darmo.

2

Aplikacja nie odpowiada (ANR) dialogowe

Jak można sobie wyobrazić, jeśli główny wątek jest zajęty z ciężkim obliczenia lub czytanie dane z gniazdka sieciowego, nie może natychmiast reagować na działania użytkownika takiego jako dotknij lub przeciągnij.

Aplikacja, która nie reaguje szybko na interakcję z użytkownikiem, będzie odczuwać brak odpowiedzi na pytanie: - widoczne jest więcej niż kilkaset milisekund opóźnienia, co oznacza . Jest to tak poważny problem, że platforma Android chroni użytkowników użytkowników przed aplikacjami, które robią za dużo w głównym wątku.

Wskazówka:

Jeśli aplikacja nie reaguje na działania użytkownika w ciągu FVE sekund, użytkownik ujrzy aplikacja nie Odpowiadając okno (ANR) i będą oferowane opcję, aby zamknąć aplikację.

Poniższy zrzut ekranu pokazuje typowy dialog Android ANR:

enter image description here

Android ciężko pracuje, aby zsynchronizować interfejs użytkownika odświeża z szybkości odświeżania sprzętowego. Oznacza to, że ma on na celu przerysowanie z szybkością 60 klatek na sekundę, czyli , czyli 16,67 ms na ramkę. Jeśli pracujemy nad głównym wątkiem, który zajmuje w dowolnym miejscu blisko 16 ms, ryzykujemy, że wpłynie to na szybkość klatek, powodując animacje Janka-jąkanie , nierówne przewijanie i tak dalej.

Idealnie, oczywiście, nie chcemy zrzucać pojedynczej ramki. Jank, brak reakcji, , a zwłaszcza ANR, oferują bardzo słabe wrażenia użytkownika, co przekłada się na złe recenzje i niepopularne aplikacje. Regułą do życia przy budowaniu aplikacji Android jest: nie blokuj głównego wątku!

Wskazówka:

Android dostarcza użytecznej ścisłe ustawienie trybu w Opcjach programistów na każdym urządzeniu, które fl ash będzie na ekranie, gdy aplikacje wykonują operacje długo działa na głównym wątku.

Dalsza ochrona dodano do platformy w strukturze plastra miodu (poziom API 11), z wprowadzeniem nowej klasy wyjątkiem, NetworkOnMainThreadException, podklasy z RuntimeException który jest odrzucany, jeśli system wykryje aktywność sieci inicjowane na głównym gwintem .

Źródło:

Asynchronous Android Programowanie - Second Edition - Helder Vasconcelos - lipiec 2016

Powiązane problemy