您的位置:首页 > 产品设计 > UI/UE

【Android笔记】多线程与 UI 交互的方法

2015-09-16 20:32 471 查看
一共四种:

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();

每个实例只能执行一次,否则会抛异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: