通过查看HandlerThread,可以知道,本质上,它就是一个Thread,只不过多了一个Looper,可以跟UI线程一样,通过Handler,发送消息在后台线程中执行任务。示例代码:
package com.pocketdigi.handlerthread;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemClock;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView textView;
Handler mBackgroundHandler, mUiHandler;
//destory标记
boolean mDestoryed=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
//实例化一个HandlerThread,参数为name,可随意
HandlerThread thread = new HandlerThread("handlerThread");
//必须马上start();
thread.start();
//通过HandlerThread的looper,实例化一个handler,这个handler发送的消息都由HandlerThread处理
mBackgroundHandler = new Handler(thread.getLooper());
//无参数,默认是当前线程的handler,即UiThread
mUiHandler = new Handler();
mBackgroundHandler.post(new Runnable() {
@Override
public void run() {
// 后台线程执行
for (int i = 0; i < 100&&!mDestoryed; i++) {
SystemClock.sleep(1000);
System.out.println(i);
final int finali = i;
mUiHandler.post(new Runnable() {
//UI线程执行
@Override
public void run() {
// TODO 自动生成的方法存根
textView.setText(String.valueOf(finali));
}
});
}
}
});
}
@Override
protected void onDestroy() {
// TODO 自动生成的方法存根
super.onDestroy();
//标记activity已关闭
mDestoryed=true;
//最后让looper执行quit,否则一直在循环,HandlerThread就不会终止
mBackgroundHandler.getLooper().quit();
}
}