如何使用HandlerThread-2

如何使用HandlerThread-2

如何使用HandlerThread有解釋怎麼使用HandlerThread, 現在來寫個範例。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    <Button
        android:id="@+id/short_task"
        android:text="do short task"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:layout_toRightOf="@id/short_task"
        android:id="@+id/long_task"
        android:text="do long task"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_below="@id/short_task"
        android:text="Hello World!"
        android:id="@+id/result"
        android:textColor="#112233"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

宣告兩個Button, 一個用來模擬短任務(也就是按下去馬上執行結束),
另外一個是用來模擬執行長任務, 中間會用2秒鐘的時間來執行。

所以我們會寫出這樣的程式碼

public class MainActivity extends AppCompatActivity {
    private Button shortTask;
    private Button longTask;
    private TextView taskResult;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private StringBuffer strBuffer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
    }
    private void initData(){
        mHandlerThread = new HandlerThread("handler thread");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
        strBuffer = new StringBuffer();
    }
    private void initView(){

        shortTask = (Button) findViewById(R.id.short_task);
        longTask = (Button) findViewById(R.id.long_task);
        taskResult = (TextView) findViewById(R.id.result);
        shortTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        strBuffer.append("short task \n");
                        updateView();
                    }
                });
            }
        });
        longTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        strBuffer.append("wait long task...");
                        updateView();
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        strBuffer.append("done\n");
                        updateView();
                    }
                });
            }
        });
    }
    private void updateView(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                taskResult.setText(strBuffer.toString());
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandlerThread.quit();
    }
}

可以看到一開始宣告了一個HandlerThread, 透過start()方法來啟動
並且指定我們的Handler來負責發送訊息給HandlerThread。

mHandlerThread = new HandlerThread("handler thread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());

所以之後我們只要透過Hanlder.post()就都會發送到這隻Thread上面惹。

mHandler.post(new Runnable() {
    @Override
    public void run() {
        //do something
    }
});

可以看到結果, 他會按照按下Button的順序去執行,
如果前面有等待的任務, 則會等待前面執行完畢才會執行,
優缺點就如如何使用HandlerThread所說的。

程式碼