Android开发之子线程操作UI的几种方法
作者:SEU_Calvin 时间:2022-08-05 23:17:52
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法:
在看方法之前需要了解一下Android中的消息机制。
方法1 Activity.runOnUiThread
方法如下:
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("Hello");
}
});
这种方法简单易用,如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,就发布到事件队列的UI线程。其实和Handler差不多,都是将这个更新UI的请求消息,加入到事件队列,等待主线程空闲的时候执行。
方法2 Handler
主线程中定义Handler如下:
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
String data = (String)msg.obj;
textView.setText(data);
break;
default:
break;
}
}
};
子线程发消息,通知Handler完成UI更新,代码如下:
new Thread(new Runnable(){
@Override
public void run() {
//耗时操作
mHandler.sendEmptyMessage(0);
Message msg =new Message();
msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等
mHandler.sendMessage(msg);
}
}).start();
方法3 View.post
final Button btn =(Button)findViewById(R.id.btn);
btn.post(new Runnable(){
@Override
publicvoid run() {
btn.setText("Hello");
}
});
上面的代码就是更新btn中的内容,同样下面的代码也可以达到这种效果。
Handler handler = new Handler();
final Button btn = (Button)findViewById(R.id.btn);
handler.post(new Runnable(){
@Override
public void run() {
btn.setText("Hello");
}
});
这个是用handler.post方法,一个是用View.post方法,handler.post方法已经在Android的消息机制中介绍过了,其实最终也是调用了方法2中的send方法。
现在看一下View.post方法的源代码:
public boolean post(Runnable action) {
Handler handler;
AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
handler = attachInfo.mHandler;
} else {
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}
return handler.post(action);
}
方法中主要的功能代码就是attachInfo.mHandler,获取当前线程(即UI线程)的Hanlder,然后将action对象post到Handler里。在Handler里的处理过程上面链接文已经分析的很清楚了,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler的dispatchMessage方法里,第一句话就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
方法4 广播
子线程中发送广播,主线程中接收广播并更新UI。
方法5 使用AsyncTask
为了简化子线程中访问UI,系统提供给了我们AsyncTask。
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行进度和结果传递给主线程并更新UI。本质上来说AsyncTask封装了Thread和Handler,但是AsyncTask不适合进行特别耗时的后台任务,如果需要进行特别耗时的任务,建议使用线程池。
不同API版本的AsyncTask具有不同的表现,因此需要注意。为了控制篇幅,具体的AsyncTask的使用方法和工作原理,我打算后面单独成文进行介绍。
以上所述是小编给大家介绍的Android开发之子线程操作UI的几种方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
来源:http://blog.csdn.net/seu_calvin/article/details/52120389
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android通过HTTP协议实现断点续传下载实例
Java中的CAS和ABA问题说明
![](https://img.aspxhome.com/file/2023/7/66637_0s.png)
C#实现根据图片的链接地址获取图片的后缀名
Servlet3.0实现文件上传的方法
![](https://img.aspxhome.com/file/2023/3/58143_0s.png)
Java二分查找算法与数组处理的应用实例
![](https://img.aspxhome.com/file/2023/4/61494_0s.png)
基于Java随机生成手机短信验证码的实例代码
全局记录Feign的请求和响应日志方式
Java 如何将表格数据导入word文档中
c# 遍历 Dictionary的四种方式
![](https://img.aspxhome.com/file/2023/5/102205_0s.png)
教你怎么用Java开发扫雷游戏
![](https://img.aspxhome.com/file/2023/0/63480_0s.png)
flutter text组件使用示例详解
Android VelocityTracker使用案例详解
深入剖析Java中的各种异常处理方式
Java如何定义Long类型
![](https://img.aspxhome.com/file/2023/6/62246_0s.png)
java 键盘输入一个数,输出数组中指定元素的示例
java 设计模式之单例模式
Java中Steam流的用法详解
Android实现代码画虚线边框背景效果
![](https://img.aspxhome.com/file/2023/8/123298_0s.png)