Andoird是不允许直接在子线程中更新UI的。原因是子线程中更新UI会引起线程不安全问题,导致界面卡顿掉帧。
在子线程中run方法中,通过handler.post或其他方式将更新UI的任务消息发送到UI线程,由UI线程更新UI。
Thread和Runnable的区别
- Thread代表线程类。start()开启子线程,执行体为run()方法
- Runnable只是一个接口,直接调用其run()方法,并不会开启子线程
下面介绍几种子线程更新UI的方法
方式一:Handler和Message
常规使用方法
子线程run()方法里handle.sendmessage发消息
主线程handler.handleMessage更新ui
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
String s = String.valueOf(msg.what);
TextView tv = (TextView)findViewById(R.id.textView);
tv.setText(tv.getText() + ” ” + s);
}
};
Runnable run = new Runnable(){
@Override
public void run(){
Random r = new Random();
int rnum = r.nextInt((100 – 10) + 1) + 10;
handler.sendEmptyMessage(rnum);
handler.postDelayed(run, 5000);
i++;
if (i==5){
handler.removeCallbacks(run);
}
}
};
方式二:在子线程中调用view.post
myView.post(new Runnable() {
@Override
public void run() {
// 更新UI
myView.setText(“更新UI”);
}});
方式三:在子线程中调用runOnUIThread
在子线程中直接调用Activity.runOnUiThread(Runnable action)方法
runOnUiThread(new Runnable() {
@Override
public void run() {
// 更新UI的操作
}
});
方式四:Handler.post()方法
追踪源码发现,这几种方法也是通过Handler+Message来实现的。一般简单的更新UI推荐使用方法二和方法三
注意
Runable接口run()方法可理解为一个回调,配合Thread.start()才是开启子线程