ハンドラー vs AsyncTask vs スレッド [closed] 質問する

ハンドラー vs AsyncTask vs スレッド [closed] 質問する

AndroidのHandlers、、の違いについて少し混乱しました。StackOverflow でかなりの数のブログや質問を読みました。AsyncTaskThreads

Handlerは、UI との通信を可能にするバックグラウンド スレッドです。たとえば、進行状況バーの更新は を介し​​て行う必要がありますHandler。ハンドラーを使用すると の利点が得られるMessagingQueuesため、メッセージをスケジュールしたり、複数の UI 要素を更新したり、繰り返しタスクを実行したりする場合に役立ちます。

AsyncTaskは似ていますが、実際には を使用しますHandlerが、UI スレッドでは実行されないため、Web サービスの取得など、データの取得に適しています。後で UI を操作できます。

Threadただし、UI と対話することはできず、より「基本的な」スレッドが提供され、 のすべての抽象化が失われますAsyncTask

ただし、ソケット接続をサービスで実行したいのですが、これはハンドラーまたはスレッドで実行する必要がありますか、それともAsyncTaskUI 操作はまったく必要ありません。どちらを使用するとパフォーマンスに違いが生じますか?

一方、ドキュメンテーション大幅に改善されました。

ベストアンサー1

ソースコードを見れば、完全に Java で書かれていることがわかりますAsyncTaskHandler(例外もありますが、それは重要な点ではありません)

AsyncTaskしたがって、やには魔法はありませんHandler。これらのクラスは、開発者としての私たちの生活を楽にします。

たとえば、プログラム A がメソッド A() を呼び出す場合、メソッド A() はプログラム A とは別のスレッドで実行される可能性があります。次のコードで簡単に確認できます。

Thread t = Thread.currentThread();    
int id = t.getId();

なぜ一部のタスクに新しいスレッドを使用する必要があるのでしょうか? Google で検索してください。理由はたくさんあります。たとえば、重い処理、長時間実行される作業などです。

では、、、およびThreadの違いは何でしょうか?AsyncTaskHandler

AsyncTaskおよび はHandlerJava で記述されています (内部的には を使用します)。そのため、またはThreadで実行できることはすべて、 を使っても実行できます。HandlerAsyncTaskThread

何が本当に役立つのでしょうHandlerAsyncTask?

最も明白な理由は、呼び出し元スレッドとワーカー スレッド間の通信です。 (呼び出し元スレッド:ワーカー スレッドを呼び出していくつかのタスクを実行するスレッド。呼び出し元スレッドは必ずしも 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呼び出し元スレッドと安全に通信できることを覚えておいてください。

おすすめ記事