回答:
IMO、AsyncTaskは、低レベルの詳細(スレッド、メッセージループなど)をあまり気にすることなく、Androidアプリでバックグラウンド処理を実現する便利で使いやすい方法を提供するために作成されました。タスクをスケジュールし、必要に応じてUIを簡単に更新するのに役立つコールバックメソッドを提供します。
ただし、AsyncTaskを使用する場合、開発者はその制限を受け入れていることに注意することが重要です。これは、クラスの作成者が行った設計上の決定が原因です。たとえば、最近AsyncTasksを使用してスケジュールできるジョブの数に制限があることがわかりました。
ハンドラーは2つの中でより透過的で、おそらくより多くの自由を与えます。したがって、より詳細な制御が必要な場合は、ハンドラを選択します。それ以外の場合は、AsynTaskが正常に機能します。
AsyncTasks1つのスレッドで実行されるため、並列処理は行われません。並列Executor実装でそれらを実行することもできます。
私の経験則は:
リストに表示するデータをダウンロードするなど、UIに関連する分離された処理を行う場合は、を使用してくださいAsyncTask。
ダウンロード時に表示されるImageViews(サムネイルのダウンロードなど)複数の画像をダウンロードするなど、複数の繰り返しタスクを実行している場合は、でタスクキューを使用しますHandler。
主に次の理由により、可能な場合は常にAsyncTaskの使用を避けてください。
ThreadPoolベースと最大サイズがシステムによって設定されているため、AsyncTaskの実行は保証されていません。非同期タスクを作成しすぎると、最終的に破棄されます。
AsyncTaskは、アクティビティのライフサイクルに応じて、実行中であっても自動的に終了することができ、それを制御することはできません
onPostExecuteなどのUIスレッドで実行されているAsyncTaskメソッドは、それが参照しているアクティビティが表示されなくなった場合、または方向が変更された後など、別のレイアウト状態にある場合に実行できます。
結論として、AsyncTaskのUIThreadリンクメソッドを使用しないでください。これが主な利点です!!! さらに、doInBackgroundで重要でない作業のみを行う必要があります。この問題の詳細については、このスレッドをご覧ください。
AsyncTaskは本当に概念的に欠陥があるのですか、それとも何か不足していますか?
結論として、上記のいずれかの問題が懸念される場合は、AsyncTaskの代わりにIntentServices、HandlerThread、またはThreadPoolExecutorを使用することをお勧めします。もちろん、より多くの作業が必要になりますが、アプリケーションはより安全になります。
x秒ごとに計算を実行する場合はRunnable、をHandler(でpostDelayed())にスケジュールRunnableし、それを現在のUIスレッドで開始する必要があります。別のスレッドで開始する場合は、HandlerThreadを使用します。AsyncTaskの方が使いやすいですが、ハンドラに勝るものはありません。
ハンドラーは、アプリケーションのメインスレッドに関連付けられています。バックグラウンドスレッドからアプリのメインスレッドに送信されるメッセージと実行可能ファイルを処理およびスケジュールします。
AsyncTaskは、時間のかかる操作によってUIをブロックすることなくUIを更新するために、バックグラウンドスレッドを処理する簡単なメソッドを提供します。
答えは、どちらもバックグラウンドスレッドからUIを更新するために使用できるということです。違いは実行シナリオにあります。ハンドラーを使用して、遅延メッセージを投稿したり、メッセージを特定の順序でMessageQueueに送信したりすることを検討できます。
アプリのメインスレッドとバックグラウンドスレッドの間で簡単に便利な方法でパラメーターを(したがって、UIを更新して)交換する場合は、AsyncTaskの使用を検討してください。
AsyncTaskバックグラウンドの作業が完了した後、UIスレッドで何かを行うことを想定しています。また、実行できるのは1回だけです(この後のステータスはFINISHED、もう一度実行しようとすると例外が発生します)。また、それを使用する柔軟性はあまりありません。はい、THREAD_POOL_EXECUTOR並列実行に使用できますが、その努力は価値がないかもしれません。
Handlerランナブルとメッセージの処理以外は何も想定していません。また、何度でも実行できます。どのスレッドにアタッチする必要があるか、他のハンドラーと通信する方法を自由に決定できますHandlerThread。したがって、それははるかに柔軟性があり、繰り返し作業に適しています。
さまざまな種類のHandler例をここで確認してください。
彼らは尋ねられる最高のインタビューの質問です。 AsyncTask -UIスレッドのオフロードとバックグラウンドでのタスクの実行に使用されます。 ハンドラー -AndroidはUIとバックグラウンドスレッド間の直接通信手段を備えています。ハンドラーを使用してメッセージを送信するか、メッセージキューを介して実行可能にする必要があります。
したがって、AsyncTasksは、タスクをバックグラウンドで実行する必要がある場合に使用され、ハンドラーは、UIとバックグラウンドスレッド間の通信に使用されます。