2011-06-30 13 views
23

ANRは例外、エラー、または何ですか?実際にtry{} catch(){}構造でそれを捕まえることはできますか?"ANR"は例外かエラーか何ですか?

+1

あなたが使用しているものプラットフォーム言及するのを忘れてしまいました。 –

+0

"I/Choreographer(xxx):xxxフレームをスキップしました!アプリケーションが主なスレッドで多すぎる作業をしている可能性があります"を探します。あなたのlogcatに。これは、あなたの問題を発見するのに役立ちます。 – Christ

+0

「what」のように見えます – Kirby

答えて

44

ANR(アプリケーションが応答していない)は、まさにエラーではありません。アプリケーションが非常に低速で応答時間が長い場合に表示され、ユーザーは待機します。あなたのアプリケーションが長い間待たされても、ユーザーは気にしません。したがって、Androidフレームワークはユーザーにアプリケーションを閉じるオプションを提供します。 http://developer.android.com/guide/practices/design/responsiveness.html

これは、メインスレッドで長時間実行されている操作を実行している場合に発生します。メインスレッドがブロックされているので、システムはこの期間中にユーザーの対話を処理できません。解決策は、ワーカースレッドで大量の操作を行い、メインスレッドを解放した状態に保つことです。メインスレッドが重い計算してか、ネットワークソケットから データを読み込むビジー状態の場合

2

あなたが想像できるように(ANR)ダイアログ

を応答しないアプリケーション、それはすぐにこのようなユーザ入力に応答することはできません をタップまたはスワイプします。

ユーザーとのやりとりに迅速に応答しないアプリケーションでは、 が応答しないと感じます。何百ミリ秒以上の遅延がある場合は、 が目立ちます。これはAndroidプラットフォームが ユーザーをメインスレッドであまりにも多くのアプリケーションから保護するというような悪質な問題です。

お知らせ:

アプリはFVE秒以内にユーザーの入力に応答しない場合、 ユーザーは、アプリケーションが(ANR)ダイアログと は、アプリケーションを終了するためのオプションが提供されますが応答しない表示されます。

次のスクリーンショット

は、一般的なAndroidのANRダイアログを示しています

enter image description here

Androidはユーザーインターフェイスが ハードウェアリフレッシュレートを再描画同期するように努めています。これは、 秒あたり60フレームのレートで再描画することを目指していることを意味します。これはフレームあたりわずか16.67msです。 を16 ms近くのどこかで使用するメインスレッドで作業すると、フレームレートに影響を与え、結果としてジャンクをぼやけて アニメーションやジャーキースクロールなどが発生する可能性があります。

もちろん、1つのフレームを削除するのは理想的です。 Jank、反応しない、 、特にANRは、非常に悪いユーザーエクスペリエンスを提供し、これは悪いレビューと人気のないアプリケーション に翻訳されます。 Android のアプリケーションをビルドする際のルールは次のとおりです。メインスレッドをブロックしないでください!

注意:アプリケーションは は、メインスレッド上で長時間実行の操作を実行すると

のAndroidは開発者向けのオプションに役立つstrictモードの設定各デバイスの 、画面上になるFL灰を提供します。

さらに保護が新しい例外クラスの 導入により、ハニカム(APIレベル11)でプラットフォームに加えて、NetworkOnMainThreadException、システムがネットワークアクティビティを検出した場合にスローされるのRuntimeExceptionのサブクラス は、メインスレッド上で を開始しました。

出典:

非同期のAndroidプログラミング - 第2版 - ヘルダーヴァスコンセロス - 2016年7月