Andriod 子线程更新UI
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()才是开启子线程