web-dev-qa-db-ja.com

スレッドとハンドラーの違い

スレッドとハンドラーの違いを誰かに教えてもらえますか?スレッドを使用するときとハンドラを使用するとき

私のプロジェクトには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();

どちらが最初に実行されますか?誰かが私を説明できますか?

20
Khodayar

同じ:現在のコードをブロックせずにタスクを非同期で実行できますが、

違い:あなたが_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 も参照してください

48
yjzhang

スレッドはほとんどの処理を実行できる汎用処理タスクですが、実行できない処理の1つはUIの更新です。

一方、ハンドラーは、UIスレッドとの通信(UIの更新)を可能にするバックグラウンドスレッドです。

そのため、たとえば、トーナを表示したり、ハンドラーに投稿されたメッセージ(実行可能)を介して進行状況バーを更新しますが、この実行可能ファイルをスレッドとして起動した場合はできません。

ハンドラーを使用すると、MessageQueuing、スケジューリング、繰り返しなどを行うこともできます。

Androidのスレッドが必要な状況にはまだ遭遇していません。

私は主にAsyncTasksとHandlersの組み合わせを使用します。

前述のタスクのハンドラー。

ダウンロード/データの取得とポーリングなどのためのAsyncTasks.

3
Darshan Mistry

Threadは実際に新しいスレッドを作成します-現在のスレッドに対して相対的にバックグラウンドで実行されているジョブの一部です。

Handler自体はバックグラウンドジョブのメカニズムを提供しません-スレッドに関連付けられたメッセージキュー(Looper)にアクセスするための単なるツールです。 UIスレッドにはデフォルトでLooperがアタッチされているため、Handler.post(Runable)でUIを更新するのが一般的です。つまり、このHandlerに関連付けられたスレッドでコードを実行します。
HandlerLooperにサービスを提供するとすぐに、Looperが関連付けられていないスレッドでは作成できません。

2
Viacheslav