学过一点Android的朋友都知道,Android的UI线程是不安全的,那么有没有相关为什么UI线程是不安全的呢?
UI线程不安全的原因,是因为UI线程是用来刷新界面的,会通过Android的invalidate()方法去刷新界面,但是invalidate不能再非UI线程去调用(原理就是你通过其他线程去调用这个方法,而UI线程也在调用这个方法,所以就会导致线程不安全了,而且在Android里面,这样做是不被允许的),所以更新UI只能在主线程。
但是有些时候我们要到子线程进行一些耗时操作,然后根据放回的结果更新UI,因此就有了Android提供的一套异步消息处理机制了。他可以完美的解决子线程更新UI的操作。
public class FragmentOne extends Fragment implements View.OnClickListener {
private static final int UPDATA=1;
private Handlerhandler =new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case UPDATA:
//更新UI的操作
text.setText("我更新了")
break;
default:
break;
}
}
};
......
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.bt:
new Thread(new Runnable() {
@Override public void run() {
Message message = new Message();
message .what = UPDATA;
handler.sendMessage(message)
}
}).start();
break;
default:
break;
}
先定义一个整数常量UPDATA,用于表示更新UI的操作,然后新增了一个Handle对象,并且重写了父类的 handleMessage()方法,在这里对具体的Message进行处理,如果发现 Message的 What字段等于定义的 UPDATA,就执行更新UI的操作。
看看下面的点击事件,没有直接在里面更新UI,而是创建一个 Message 对象,并将它的 what 字段的值设置为我们定义的整数,然后调用 Hnandle 的sendMessage()方法将Message发送出去,然后 Handle 会收到这条信息,handlerMessage() 方法就会对他进行处理,注意:因为handlerMessage()方法就是在UI线程声明,所以它运行在主线程,接下来只要对 Message携带的 what 字段的值进行判断,如果等于定义的整数常量 UPDATA ,TextView 就会被更新。
这就是Android异步消息处理的基本用法,下次再来了解他的工作原理。