一、Thread、HandlerThread
- MyThread继承于Thread类,重载Thread类的run函数,run函数执行子线程任务。实例化MyThread并调用它的start函数,子线程创建完毕并且调用MyThread.run函数。当这个run函数执行完成后,子线程也就结束了,它没有消息循环的概念。
private class MyThread extends Thread{
@Override
public void run() {
super.run();
}
}
private Thread thread = new Thread(new Runnable() {
@Override
public void run() {
}
});
//启动子线程
MyThread myThread = new MyThread();
myThread.start();
- HandlerThread创建具有消息循环功能的子线程。
private void initHandlerThread() {
//创建HandlerThread实例
HandlerThread handlerThread = new HandlerThread("handler_thread");
//开始运行线程
handlerThread.start();
//获取HandlerThread线程中的Looper实例
Looper loop = handlerThread.getLooper();
//创建Handler与该线程绑定。
Handler handler = new Handler(loop) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行子线程任务
}
};
}
二、AsyncTask
private class MyAsyncTask extends AsyncTask{
//执行线程任务前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//接收输入参数
//在方法中执行任务中的耗时操作
//返回线程任务执行的结果
@Override
protected Object doInBackground(Object[] objects) {
return null;
}
//在主线程显示线程任务执行的进度
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
}
//接收线程任务执行结果
//将执行结果显示到UI组件
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
}
//取消异步任务
@Override
protected void onCancelled() {
super.onCancelled();
}
}
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
myAsyncTask.cancel(true);
优点:
- 方便实现异步通信:不需使用 “任务线程(如继承Thread类) + Handler”的复杂组合
- 节省资源:采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销
缺点: - 多个异步操作需要更新UI时,就变得麻烦起来。
三、Activity.runOnUiThread
private Thread thread = new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//更新UI操作
}
});
}
});
Activity.runOnUiThread源码
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}