thread - removecallback android



スレッドとハンドラの違い (2)

ThreadとHandlerの尊敬について誰かに教えてもらえますか? Threadを使うときとHandlerを使うとき

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

どちらが先に走りますか? 誰かが私を説明できますか?

https://code.i-harness.com


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

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


同じこと :あなたは現在のコードをブロックすることなくタスクを非同期的に実行することができます。

違い :あなたがRunnable r = new Runnable{...}を持っていると想像してくださいRunnable r = new Runnable{...}

  • new Thread(r).start()を使用すると、実際には新しいスレッドが作成され、タスクが非同期的に実行されます。

  • new Handler().post(r) (またはMessage )を使用すると、 RunnableオブジェクトがLooper追加され、後で同じスレッドでコードが実行されます。

Thread 、通常はMainThreadまたはUIThreadにはLooperが含まれています。 MainThreadが実行されると、 LooperをループしてRunnable 1つずつ実行します。

Threadが優先される場合

ネットワーク通信のように重い作業をしているとき、または大きなビットマップファイルをデコードしているときは、新しいスレッドが推奨されます。 大量のスレッドが必要な場合は、 ExecutorServiceます。 https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

Handlerが優先される場合

あなたが他のスレッドからUIオブジェクト( TextViewテキストのような)を更新したいとき、UIオブジェクトはUIスレッドでのみ更新できることが必要です。 また、(300ミリ秒の遅延のように)後で軽いコードを実行したい場合は、 Handlerを使用できます。これは、軽量で高速なためです。

Handler vs AsyncTask vs Threadも参照してください。





handler