众所周知Android 子线程不能更新UI,谷歌提出:“一定要在主线程更新UI
”,实际是为了提高界面的效率和安全性,带来更好的流畅性;反推一下,假如允许多线程更新UI
,但是访问UI
是没有加锁的,一旦多线程抢占了资源,那么界面将会乱套更新了,体验效果就不言而喻了;所以在Android
中规定必须在主线程更新UI
。
1. runOnUiThread
// runOnUiThread是Activity中的方法,Context是它的父类,所以要转换成Activity对象才能使用
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里执行你要想的操作 比如更新ui
}
});
2. Post
textview.post(new Runnable() {
@Override
public void run() {
textview.setText(
//在这里面进行更新UI
);
}
});
new Handler(mContext.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// 在这里执行你要想的操作 比如直接在这里更新ui
}
});
3.handler
Handler的方法是入门使用比较频繁的一种,往Handler中发送一个消息,然后当Handler接收到你发送过来的消息,再在Handler执行相应的操作。
这是接收消息执行的代码:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
String b=msg.obj;
break;
}
}
};
这是发送消息执行的代码:
//我们要保证发送和接收的数据类型相同,以下例子假设我们要发送的是一串字符。
String a="112233";
Message msg = Message.obtain();
msg.what = 1;
msg.obj = a;
mHandler.sendMessage(msg);