web-dev-qa-db-ja.com

「ANR」は例外ですか、それともエラーですか、それとも何ですか?

ANRは例外ですか、エラーですか、それとも何ですか?実際にそれをtry{} catch(){}構造体でキャッチできますか?

24
lee lias

[〜#〜] anr [〜#〜](アプリケーションが応答していません)は正確にはエラーではありません。これは、アプリケーションが非常に遅く、応答に時間がかかり、ユーザーを待たせる場合に表示されます。あなたのアプリケーションが彼らを長い間待たせた場合、ユーザーは感謝しません。したがって、Androidフレームワークは、ユーザーにアプリケーションを閉じるオプションを提供します。 http://developer.Android.com/guide/practices/design/responseness.html

これは、メインスレッドで長時間実行される操作を実行しているときに発生します。メインスレッドがブロックされているため、この期間中、システムはユーザーの操作を処理できません。解決策は、ワーカースレッドで重い操作を実行し、メインスレッドを解放しておくことです。

46
rogerstone

アプリケーションが応答しません(ANR)ダイアログ

ご想像のとおり、メインスレッドが大量の計算やネットワークソケットからのデータの読み取りでビジー状態の場合、タップやスワイプなどのユーザー入力にすぐに応答することはできません。

ユーザーの操作にすばやく応答しないアプリケーションは、応答しなくなったように感じます。数百ミリ秒を超える遅延が目立ちます。これは非常に厄介な問題であるため、Androidプラットフォームは、メインスレッドで多くのことを行うアプリケーションからユーザーを保護します。

注意:

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

次のスクリーンショットは、典型的なAndroid ANRダイアログを示しています。

enter image description here

Androidは、ユーザーインターフェイスの再描画をハードウェアのリフレッシュレートと同期させるために一生懸命働いています。これは、毎秒60フレームの速度で再描画することを目的としていることを意味します。つまり、フレームあたりわずか16.67ミリ秒です。 16ミリ秒近くかかるメインスレッドで作業を行うと、フレームレートに影響を与えるリスクがあり、アニメーションの途切れやスクロールのぎくしゃくしたなどのジャンクが発生します。

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

注意:

Androidでは、各デバイスの開発者向けオプションに便利な厳密モード設定が用意されています。これは、アプリケーションがメインスレッドで長時間実行される操作を実行すると、画面に点滅します。

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

出典:

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

3
user4813855