在如何使用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所說的。