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

标签:android,子线程,ui
0
投稿

猜你喜欢

  • Android通过HTTP协议实现断点续传下载实例

    2022-12-05 23:39:05
  • Java中的CAS和ABA问题说明

    2021-08-19 11:08:18
  • C#实现根据图片的链接地址获取图片的后缀名

    2022-08-04 04:30:58
  • Servlet3.0实现文件上传的方法

    2023-08-15 00:52:44
  • Java二分查找算法与数组处理的应用实例

    2022-07-11 01:26:57
  • 基于Java随机生成手机短信验证码的实例代码

    2023-12-22 02:50:49
  • 全局记录Feign的请求和响应日志方式

    2021-08-19 18:48:02
  • Java 如何将表格数据导入word文档中

    2023-08-13 10:38:55
  • c# 遍历 Dictionary的四种方式

    2023-04-17 13:11:10
  • 教你怎么用Java开发扫雷游戏

    2023-07-22 09:49:26
  • flutter text组件使用示例详解

    2022-07-11 11:08:42
  • Android VelocityTracker使用案例详解

    2023-08-29 13:32:03
  • 深入剖析Java中的各种异常处理方式

    2022-05-29 20:20:24
  • Java如何定义Long类型

    2022-05-28 22:28:52
  • java 键盘输入一个数,输出数组中指定元素的示例

    2023-11-24 20:31:14
  • java 设计模式之单例模式

    2021-10-07 22:00:46
  • Java中Steam流的用法详解

    2021-12-16 14:18:50
  • Android实现代码画虚线边框背景效果

    2022-11-03 10:48:42
  • Java实现的基于socket通信的实例代码

    2021-12-30 19:06:50
  • Android CountDownTimer实现定时器和倒计时效果

    2023-12-09 02:11:28
  • asp之家 软件编程 m.aspxhome.com