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

Android 在其他线程中更新UI线程的解决方法

2016-05-15 03:07 337 查看
1 用Activity对象的runOnUiThread方法更新

new Thread() {
public void run() {
//这儿是耗时操作,完成之后更新UI;
runOnUiThread(new Runnable(){
@Override
public void run() {
//更新UI
imageView.setImageBitmap(bitmap);
}
});
}
}.start();


2子线程调用Handler的sendMessage(message)发送消息

//主线程中定义Handler
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//完成主界面更新,拿到数据
String data = (String)msg.obj;

updateWeather();
textView.setText(data);
break;
default:
break;
}
}
};
//子线程发消息,通知Handler完成UI更新
private void updateWeather() {
new Thread(new Runnable(){
@Override
public void run() {
//耗时操作,完成之后发送消息给Handler,完成UI更新;
mHandler.sendEmptyMessage(0);
//需要数据传递,用下面方法;
Message msg =new Message();
msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;
mHandler.sendMessage(msg);
}
}).start();
}


3 View.post(Runnable )

imageView.post(new Runnable(){
@Override
public void run() {
//更新ui
imageView.setImageBitmap(bitmap);
}
});


4 AsyncTask

总结

1.如果只是单纯的想要更新UI而不涉及到多线程的话,使用View.post()就可以了;

2.需要另开线程处理数据以免阻塞UI线程,像是IO操作或者是循环,可以使用Activity.runOnUiThread();

3.如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,就需要使用Handler + Thread的方式;

4.如果是后台任务,像是下载任务等,就需要使用AsyncTask。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: