izuki
9/13/2017 - 6:50 AM

HandlerとHanderThreadの違い

HandlerとHanderThreadの違い

/*
    HandlerThread + Handler を使って mainスレッドからワーカースレッド(main以外のスレッド)
    を起動させる
 */
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 別スレッド生成 -> スレッド起動
        HandlerThread handlerThread = new HandlerThread("other");
        handlerThread.start();

        // handlerThreadのLooperインスタンスを引数にしてHandlerインスタンス生成
        Handler handler = new Handler(handlerThread.getLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
                // ワーカスレッド(重い処理を行わせる)
            }
        });
    }
}
/*
    Handler を使って mainスレッドからmainスレッドを起動させる
 */
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // mainスレッドでハンドラを使う
        Handler handler = new Handler();   // 引数なしだとcurrent thread の Looperが指定される

        // これでもOK
        // Handler handler = new Handler(Looper.getMainLooper());

        // mainスレッドのキューへRunnableを渡す
        handler.post(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
                // mainスレッド(UIスレッド)
            }
        });
    }
}