1. ホーム
  2. android

[解決済み] Androidです。Handler()とThreadはいつ使い分ける?

2022-05-13 17:31:08

質問

何かを実行する必要があるとき 非同期に のような 長く続くタスク や、ネットワークを使うロジックなど、何らかの理由によるものです。 を起動すると 新しいスレッド を起動して実行すれば問題なく動作します。 スレッドを作成する ハンドラ を作成し、それを実行しても同様に動作します。 何が違うのでしょうか?それぞれをいつ使うべきですか? また Handler でなく Thread ?

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

どのように解決するのですか?

もしあなたがしていることが重いことであれば、スレッドで行う必要があります。明示的に独自のスレッドで開始しない場合、メイン (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、重い演算など)を行う場合は、いつでもThreadを使用する必要があるということです。