AndroidのHandlers
、、の違いについて少し混乱しました。StackOverflow でかなりの数のブログや質問を読みました。AsyncTask
Threads
Handler
は、UI との通信を可能にするバックグラウンド スレッドです。たとえば、進行状況バーの更新は を介して行う必要がありますHandler
。ハンドラーを使用すると の利点が得られるMessagingQueues
ため、メッセージをスケジュールしたり、複数の UI 要素を更新したり、繰り返しタスクを実行したりする場合に役立ちます。
AsyncTask
は似ていますが、実際には を使用しますHandler
が、UI スレッドでは実行されないため、Web サービスの取得など、データの取得に適しています。後で UI を操作できます。
Thread
ただし、UI と対話することはできず、より「基本的な」スレッドが提供され、 のすべての抽象化が失われますAsyncTask
。
ただし、ソケット接続をサービスで実行したいのですが、これはハンドラーまたはスレッドで実行する必要がありますか、それともAsyncTask
UI 操作はまったく必要ありません。どちらを使用するとパフォーマンスに違いが生じますか?
一方、ドキュメンテーション大幅に改善されました。
ベストアンサー1
ソースコードを見れば、完全に Java で書かれていることがわかりますAsyncTask
。Handler
(例外もありますが、それは重要な点ではありません)
AsyncTask
したがって、やには魔法はありませんHandler
。これらのクラスは、開発者としての私たちの生活を楽にします。
たとえば、プログラム A がメソッド A() を呼び出す場合、メソッド A() はプログラム A とは別のスレッドで実行される可能性があります。次のコードで簡単に確認できます。
Thread t = Thread.currentThread();
int id = t.getId();
なぜ一部のタスクに新しいスレッドを使用する必要があるのでしょうか? Google で検索してください。理由はたくさんあります。たとえば、重い処理、長時間実行される作業などです。
では、、、およびThread
の違いは何でしょうか?AsyncTask
Handler
AsyncTask
および はHandler
Java で記述されています (内部的には を使用します)。そのため、またはThread
で実行できることはすべて、 を使っても実行できます。Handler
AsyncTask
Thread
何が本当に役立つのでしょうHandler
かAsyncTask
?
最も明白な理由は、呼び出し元スレッドとワーカー スレッド間の通信です。 (呼び出し元スレッド:ワーカー スレッドを呼び出していくつかのタスクを実行するスレッド。呼び出し元スレッドは必ずしも UI スレッドである必要はありません)。 もちろん、他の方法で 2 つのスレッド間で通信することもできますが、スレッド セーフティのために多くの欠点 (および危険) があります。
そのため、Handler
と を使用する必要がありますAsyncTask
。これらのクラスはほとんどの作業を実行するので、どのメソッドをオーバーライドするかを知るだけで済みます。
Handler
との違いは次のとおりAsyncTask
です。呼び出し元スレッドがUI スレッドのAsyncTask
場合に使用します。Android ドキュメントには次のように記載されています。
AsyncTask は UI スレッドを適切かつ簡単に使用できるようにします。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を公開できます。
私は2つの点を強調したいと思います。
1) UI スレッドを簡単に使用できます (呼び出し元スレッドが UI スレッドの場合に使用します)。
2) ハンドラーを操作する必要はありません。(つまり、AsyncTask の代わりに Handler を使用できますが、AsyncTask の方が簡単なオプションです)。
この投稿ではまだ触れていないことがたくさんあります。たとえば、UI スレッドとは何か、なぜそれが簡単なのかなどです。各クラスの背後にあるいくつかのメソッドを知って使用すれば、その理由を完全に理解できます。
@: Android のドキュメントを読むと、次のことがわかります。
ハンドラを使用すると、スレッドのMessageQueueに関連付けられたMessageおよびRunnableオブジェクトを送信および処理できます。
この説明は、最初は奇妙に思えるかもしれません。各スレッドにはメッセージ キュー (ToDo リストのようなもの) があり、スレッドは各メッセージを受け取り、メッセージ キューが空になるまでそれを実行します (私たちが仕事を終えて就寝するのと同じように)。したがって、Handler
通信するときは、呼び出し元のスレッドにメッセージを渡して、処理を待機するだけです。
複雑ですか?Handler
呼び出し元スレッドと安全に通信できることを覚えておいてください。