ソースコードを見る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
との違いは次のとおりです。呼び出し元スレッドがUIスレッドの場合にAsyncTask
使用します。これはAndroidドキュメントが言っていることです:AsyncTask
AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、バックグラウンド操作を実行してUIスレッドで結果を公開できます。
2つのポイントを強調したいと思います。
1)UIスレッドの使いやすさ(したがって、呼び出し元のスレッドがUIスレッドの場合に使用します)。
2)ハンドラーを操作する必要はありません。(意味:AsyncTaskの代わりにHandlerを使用できますが、AsyncTaskの方が簡単なオプションです)。
この投稿には、まだ言っていないことがたくさんあります。たとえば、UIスレッドとは何か、なぜそれが簡単なのかなどです。各クラスの背後にあるいくつかのメソッドを知ってそれを使用する必要があります。その理由を完全に理解できます。
@:Androidドキュメントを読むと、次のように表示されます。
ハンドラーを使用すると、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信および処理できます。
この説明は、最初は奇妙に思えるかもしれません。各スレッドには(やることリストのように)各メッセージキューがあることを理解するだけでよく、スレッドは各メッセージを受け取り、メッセージキューが空になるまでそれを実行します(作業を終えて就寝するのと同じように)。したがって、Handler
通信するときは、呼び出し元のスレッドにメッセージを送信するだけで、処理を待機します。
複雑?Handler
発信者スレッドと安全に通信できることを覚えておいてください。