一共四种:
1.Activity.runOnUIThread(Runnable action)
2.View.post(Runnable action),View.postDelay(Runnable action)
3.Handler
4.AsyncTask
一、Activity.runOnUIThread(Runnable action)
new Thread(new Runnable() {
@Override
public void run() {
// 子线程中处理一些事…………
runOnUiThread(new Runnable() {
@Override
public void run() {
// 这里的代码在主线程中执行
}
});
}
}).start();
二、View.post(Runnable action),View.postDelay(Runnable action)
new Thread(new Runnable() {
@Override
public void run() {
// 子线程中处理一些事…………
textView.post(new Runnable() {
@Override
public void run() {
// 这里的代码在主线程中执行
}
});
}
}).start();
三、Handler
1.先在主线程中定义一个Handler:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TEST:
// 处理消息,进行UI操作
break;
default:
break;
}
}
};
2.在子线程中用Handler传输Message对象:
new Thread(new Runnable() {
@Override
public void run() {
// 子线程中处理一些事……
……
// 将结果发送到主线程
Message msg = new Message();
// 标记
msg.what = TEST;
// 可携带两个整型数据
msg.arg1 = ...
msg.arg2 = ...
// 可携带Object对象
msg.obj = ...
handler.sendMessage(msg);
}
}).start();
四、AsyncTask
1.继承AsyncTask抽象类:
/**
* 三个泛型参数分别为传入的参数、进度单位、返回值类型
* Void表示不需要传入参数
*/
public class MyTask extends AsyncTask<Void, Integer, String> {
// 用到的对象
private Context context;
private ListView lvApp;
public MyTask(Context context, ListView listView) {
super();
this.context = context;
this.lvApp = listView;
}
/** 任务开始执行之前调用,用于初始化操作 **/
@Override
protected void onPreExecute() {
}
/** 所有代码都在子线程中运行,用于处理耗时任务,不能操作UI **/
@Override
protected String doInBackground(Void... params) {
// ……
return str;
}
/** 后台任务通过publishProgress()方法后,此方法很快被调用,可操作UI **/
@Override
protected void onProgressUpdate(Integer... values) {
}
/** 后台任务执行完毕并使用return返回时,此方法很快被调用,可操作UI **/
@Override
protected void onPostExecute(String result) {
}
}
2.在主线程中启动任务
new MyTask(arg1, arg2).execute();
每个实例只能执行一次,否则会抛异常。