142

長時間実行されるタスクやネットワークを使用するロジックなど、非同期で実行するものが必要な場合、または何らかの理由で、新しいスレッドを開始して実行すると正常に機能します。ハンドラーを作成して実行することも同様に機能します。違いは何ですか?それぞれをいつ使用する必要がありますか?を使用するのではなく、を使用する利点/理由は何ですか?HandlerThread

PS。-この質問のために、無視しましょうAsyncTask。-Handler().postDelayedユースケースは私には明らかです。この質問のために、タスクをすぐに開始する必要があると仮定しましょう。

4

9 に答える 9

175

あなたがしていることが「重い」場合は、スレッドでそれを行う必要があります。独自のスレッドで明示的に開始しない場合は、メイン(UI)スレッドで実行されます。これは、ユーザーによるインターフェイスの応答が不安定または遅いために目立つ場合があります。

興味深いことに、スレッドを使用している場合は、開始している作業スレッドとメインスレッドの間の通信手段としてハンドラーも使用すると便利なことがよくあります。

典型的なスレッド/ハンドラーの相互作用は次のようになります。

Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 0){
            updateUI();
        }else{
            showErrorDialog();
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler and it will do it for us.
            h.sendEmptyMessage(0);
        }else{
            h.sendEmptyMessage(1);
        }
    }   
};

ただし、一般的に、長時間実行または非常に集中的な作業(つまり、ネットワーク、ファイルIO、重い算術など)を実行するときは、いつでもスレッドを使用する必要があります。

于 2012-12-19T14:40:47.817 に答える
75

Handler と Thread は、実際には 2 つの異なるものです。

実行時間の長いジョブを実行するには、スレッドを作成する必要があります。

ハンドラーは、2 つのスレッド間で通信するのに非常に便利なオブジェクトです (たとえば、バックグラウンド スレッドは UI を更新する必要があります。ハンドラーを使用して、バックグラウンド スレッドから UI スレッドに Runnable をポストできます)。

したがって、ハンドラーまたはスレッドのどちらかを選択することはできません。重い仕事は糸を使おう!(バックグラウンドスレッドが別のスレッドで実行されるジョブをトリガーする場合は、ハンドラーを使用できます-ほとんどの場合UIスレッド)

于 2012-12-19T14:48:20.187 に答える
21

Handlerは同じスレッドThreadで実行され、は別のThreadスレッドで実行されます。

同じスレッドで何かを実行する必要がある場合は、ハンドラーを使用します。通常はGUI要素などです。

メインスレッドを他のことをするために自由に保ちたい場合は、スレッドを使用してください。かなりの時間がかかるものにはこれを使用してください。

于 2012-12-19T14:40:58.480 に答える
4

新しいスレッドからユーザーインターフェイスを更新する必要がある場合は、ユーザーインターフェイススレッドと同期する必要があります。

これには、android.os.HandlerクラスまたはAsyncTasksクラスを使用できます。

Handlerクラスは、ユーザーインターフェイスを更新できます。ハンドラーは、MessageクラスまたはRunnableクラスのインスタンスを受信するためのメソッドを提供します。

スレッドは、sendMessage(Message msg)メソッドまたはsendEmptyMessage()メソッドを介してメッセージを投稿できます。

...スレッドなどに関する詳細はこちら(さまざまなスレッドおよび同期メカニズムのturorialsと、いつ何を使用するかを含む)

于 2012-12-19T14:41:46.807 に答える
1

HandlerThreadQueued メカニズムを作成するためにと組み合わせて使用​​できます。handlerを使ってに何かを投稿できますThread Looper

于 2012-12-19T14:43:27.187 に答える