スレッドとハンドラーの違いを誰かに教えてもらえますか?スレッドを使用するときとハンドラを使用するとき
私のプロジェクトには2つのコードがありますが、理解できません。
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// Do SomeThings
}
};
そして
private class readThread extends Thread
{
Handler mHandler;
readThread(Handler h){
mHandler = h;
this.setPriority(Thread.MIN_PRIORITY);
}
@Override
public void run()
{
// Do SomeThings
}
}
そして、別のメソッドでこのようなハンドラを呼び出します
read_thread = new readThread(handler);
read_thread.start();
どちらが最初に実行されますか?誰かが私を説明できますか?
同じ:現在のコードをブロックせずにタスクを非同期で実行できますが、
違い:あなたが_Runnable r = new Runnable{...}
_を持っていると想像してください
new Thread(r).start()
を使用すると、実際に新しいスレッドを作成し、タスクを非同期で実行します。
new Handler().post(r)
(またはMessage
)を使用する場合、Runnable
オブジェクトをLooper
に追加し、後で同じスレッドでコードを実行しました。
Thread
、通常はMainThread
またはUIThread
にはLooper
が含まれます。 MainThread
が実行されると、Looper
をループし、Runnable
を1つずつ実行します。
スレッドが優先される場合:
ネットワーク通信のような重い作業を行っている場合、または大きなビットマップファイルをデコードしている場合は、新しいスレッドが推奨されます。大量のスレッドが必要な場合は、ExecutorService
がさらに推奨されます。 https://developer.Android.com/reference/Java/util/concurrent/ExecutorService.html
ハンドラが優先される場合:
UIオブジェクト(TextView
テキストなど)を他のスレッドから更新する場合、UIオブジェクトはUIスレッドでのみ更新できる必要があります。また、300msの遅延など、ライトコードを後で実行したい場合は、軽量で高速なのでHandler
を使用できます。
Handler vs AsyncTask vs Thread も参照してください
スレッドはほとんどの処理を実行できる汎用処理タスクですが、実行できない処理の1つはUIの更新です。
一方、ハンドラーは、UIスレッドとの通信(UIの更新)を可能にするバックグラウンドスレッドです。
そのため、たとえば、トーナを表示したり、ハンドラーに投稿されたメッセージ(実行可能)を介して進行状況バーを更新しますが、この実行可能ファイルをスレッドとして起動した場合はできません。
ハンドラーを使用すると、MessageQueuing、スケジューリング、繰り返しなどを行うこともできます。
Androidのスレッドが必要な状況にはまだ遭遇していません。
私は主にAsyncTasksとHandlersの組み合わせを使用します。
前述のタスクのハンドラー。
ダウンロード/データの取得とポーリングなどのためのAsyncTasks.
Thread
は実際に新しいスレッドを作成します-現在のスレッドに対して相対的にバックグラウンドで実行されているジョブの一部です。
Handler
自体はバックグラウンドジョブのメカニズムを提供しません-スレッドに関連付けられたメッセージキュー(Looper
)にアクセスするための単なるツールです。 UIスレッドにはデフォルトでLooper
がアタッチされているため、Handler.post(Runable)
でUIを更新するのが一般的です。つまり、このHandler
に関連付けられたスレッドでコードを実行します。Handler
がLooper
にサービスを提供するとすぐに、Looper
が関連付けられていないスレッドでは作成できません。