ソースコードを見るAsyncTask
と、Handler
純粋にJavaで記述されていることがわかります。(ただし、いくつかの例外があります。しかし、それは重要なポイントではありません)
つまり、AsyncTask
やには魔法はありませんHandler
。これらのクラスにより、開発者としての生活が楽になります。
例:プログラムAがメソッドA()を呼び出す場合、メソッドA()はプログラムAを使用して別のスレッドで実行できます。次のコードで簡単に確認できます。
Thread t = Thread.currentThread();
int id = t.getId();
一部のタスクに新しいスレッドを使用する必要があるのはなぜですか?あなたはそれをググることができます。多くの多くの理由、例えば:長時間の作業を大幅に持ち上げる。
だから、何の違いはThread
、AsyncTask
とHandler
?
AsyncTask
またHandler
、Javaで記述されているため(内部ではを使用しているためThread
)、Handler
またはAsyncTask
で実行できることはすべて、を使用してThread
も実現できます。
何をすることができますHandler
し、AsyncTask
本当に役立ちますか?
最も明白な理由は、呼び出し側スレッドとワーカースレッド間の通信です。(呼び出し側スレッド:いくつかのタスクを実行するためにワーカースレッドを呼び出すスレッド。呼び出し側スレッドは必ずしもUIスレッドである必要はありません)。もちろん、他の方法で2つのスレッド間で通信できますが、スレッドの安全性のために多くの欠点(および危険)があります。
そのためHandler
、およびを使用する必要がありAsyncTask
ます。これらのクラスはほとんどの作業を行います。オーバーライドするメソッドを知るだけで済みます。
違いHandler
とは、AsyncTask
次のとおりです。使用AsyncTask
時に発信者のスレッドがあるUIスレッド。これはandroidドキュメントが言うことです:
AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、UIスレッドでバックグラウンド操作を実行して結果を公開できます
2つのポイントを強調したいと思います。
1)UIスレッドの簡単な使用(したがって、呼び出し側スレッドがUIスレッドの場合に使用)。
2)ハンドラーを操作する必要はありません。(意味:AsyncTaskの代わりにハンドラーを使用できますが、AsyncTaskの方が簡単なオプションです)。
この投稿には、まだ触れていないことがたくさんあります。たとえば、UIスレッドとは何か、なぜ簡単なのか、などです。各クラスの背後にあるいくつかのメソッドを知って使用する必要があります。その理由は完全に理解できます。
@:Androidドキュメントを読むと、次のように表示されます。
ハンドラーを使用すると、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理できます
この説明は、最初は奇妙に思えるかもしれません。各スレッドには(to-doリストのような)各メッセージキューがあることを理解するだけでよく、スレッドは各メッセージを取得し、メッセージキューが空になるまでそれを実行します(作業を完了して就寝するのと同じように)。そうするときHandler
通信するは、呼び出し側のスレッドにメッセージを表示するだけで、処理を待機します。
複雑ですか?Handler
呼び出し側スレッドと安全に通信できることを覚えておいてください。