1、定义子线程类,继承HandlerThreand
public class MyHandlerThread extends HandlerThread {
private Handler mUIHandler;//主线程的Handler
private static final String TAG = "DownloadThread";
public static final int TYPE_START = 2;//通知主线程任务开始
public static final int TYPE_FINISHED = 3;//通知主线程任务结束
public MyHandlerThread(String name) {
super(name);
}
//注入主线程Handler
public void setUIHandler(Handler mUIHandler) {
mUIHandler = mUIHandler;
Log.e(TAG, "setUIHandler: 2.主线程的handler传入到Download线程");
}
//线程任务
public void startTask() {
Log.e(TAG, "startDownload: 3.通知主线程,子线程任务开始");
mUIHandler.sendEmptyMessage(TYPE_START);
//模拟下载
Log.e(TAG, "startDownload: 5.Download线程下载中...");
SystemClock.sleep(2000);
Log.e(TAG, "startDownload: 6.通知主线程,子线程任务完成");
mUIHandler.sendEmptyMessage(TYPE_FINISHED);
}
}
2、使用
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private MyHandlerThread mHandlerThread;//子线程
private Handler mUIhandler;//主线程的Handler
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化,参数为线程的名字
mHandlerThread = new MyHandlerThread ("mHandlerThread");
//调用start方法启动线程
mHandlerThread.start();
//初始化Handler,传递mHandlerThread内部的一个looper
mUIhandler = new Handler(mHandlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
//判断mHandlerThread里传来的msg,根据msg进行主页面的UI更改
switch (msg.what) {
case MyHandlerThread.TYPE_START:
Log.e(TAG, "4.主线程知道子线程任务开始了...这时候可以更改主界面UI");
break;
case MyHandlerThread.TYPE_FINISHED:
Log.e(TAG, "7.主线程知道子线程任务完成了...这时候可以更改主界面UI,收工");
break;
default:
break;
}
super.handleMessage(msg);
}
};
//子线程注入主线程的mUIhandler,可以在子线程执行任务的时候,随时发送消息回来主线程
mHandlerThread.setUIHandler(mUIhandler);
//子线程任务开始
mHandlerThread.startTask();
}
@Override
protected void onDestroy() {
//有2种退出方式
mHandlerThread.quit();
//mHandlerThread.quitSafely(); 需要API>=18
super.onDestroy();
}
}