异步更新UI的四种方法和Handler浅分析

本文介绍了Android中更新UI的四种常见方法:Handler消息传递机制,包括Message的使用和Handler的send方法;AsyncTask异步任务的执行流程;runOnUiThread方法的直接调用;以及Handler的post方法。详细阐述了每个方法的工作原理和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Handler消息传递机制

通过结合Handler与Message可简单有效地实现线程之间的通信。
传递消息的步骤主要有4步:

  1. 在主线程构造一个Handler对象,并启动分线程

关键代码

Handler handler=new Handler();
 {
public void handleMessage(android.os.Message msg)
     {
     if(msg.what==0x123){tv.setText("");}
     }
}`

.

  1. 在分线程中构造一个Message对象的消息包
    Message是多线程通信中存放消息的包裹,作用类似有Intent机制的Bundle工具。实例可通过的obtain方法 获得,也可以通过Handler对象的obtianMessage方法获得。
 public static Message obtian(Handler h,int what,int arg1,int arg2,Object obj)

参数说明

  • what:整形的消息标识,用于标识本次消息的唯一编号。
  • arg1:整型数,可存放消息的处理结果。
  • arg2:整形数,可存放消息的处理代码。
  • obj:Object类型,可存放返回消息的数据结构。
  • replyTo:Message类型,回应信使,在挂进程通信使用。

3.在分线程中通过Handler对象将Message消息发出去
处理器Handler的消息发送操作主要是各类send方法

  • obtainMessage()
  • sendMessage()
  • sendMessageDelayed()
  • sendMessageAtTime()
  • sendEmptyMessage()
  • removeMessage()
  • hasMessage()

4主线程中Handler对想处理接受到的消息
主线程处理分线程发出的消息需要实现Handler对象的handleMessage方法,根据Message的消息具体内容分别进行相应处理。
所以可以用来作为更新UI的一种方法

2.使用AsyncTask异步任务

AsyncTask这个轻量级的异步任务工具。内部已经封装好Thread+Handler的线程通信。
所以只需编写业务代码即可。(AsyncTask通常用于网络访问操作,包括HTTP接口调用、文件下载与上传)
开发者自定义的任务类需要实现以下方法

  • onPreExecute:准备执行任务时触发。
  • doInBackground:在后台执行的业务处理》网络请求等异步处理操作都放在该方法中
  • onPostExecute:任务执行完成是触发。
  • onCancelled:调用任务对象的cancel方法时触发。

更新UI的操作只能在onPostExecute(String result)方法中

3.使用runOnUiThread(action)方法

runOnUiThread(new Runnable){
.....
}

主要的业务逻辑代码在runOnUiThread

4.使用Handler的post(Runnable r)方法

主要代码

 Handler handler = new Handler();
    handler.post(new Runnable){}

解释下Handler机制
Handler有这样三个特点:
1.允许你去发送并处理一条与Runnable对象和MessageQueue相关联的消息
2.每个Handler实例都与一个单独的线程和该线程的MessageQueue相关
3.当你创建一个新的处理程序是,它将绑定到正在创建的线程的线程/消息队列

构造方法:如果要对发送的消息进行操作则需要覆写handleMessage方法

Handler handler = new Handler(){
@Override
 public void handleMessage(Message msg){//}
}

调用函数:post(Runnable r)将Runnable添加到MessageQueue中。如果发送的是runnable则忽略掉handleMessage方法的执行。

  • postAtTime(Runnable r,long updateMillis)在指定的时间点运行runnable

  • postDelayed(Runnable r,long delayMillis)在延迟一段时间后运行runnable

Handler常用类,四个组成部分
1.Message 消息,被传递和处理的数据
public static Message obtian(Handler h,int what,int arg1,int arg2,Object obj)
2.MessageQueue:消息队列,本质是一个数据结构,用来存放Handler发送过来的消息,按照先进先出执行。
3.Handler处理者,负责Message的发送及处理。
4.Looper:循环器,不断从MessageQueue中抽取Message。
5.Thread:线程,负责调度整个消息循环。
在非主线程中创建handler
a.手动进行Looper.prepare()及Looper.loop()、Looper.myLooper().quit();
b.利用HandlerThread类进行创建。HandlerThread继承Thread,它会启动一个带looper的新线程,但是必须要调用start()方法。

Android多线程的四大组件

  • IntentService(只能依次处理,一个接一个) service+Handler+HandlerThread
  • HandlerThread Handler+线程+Looper
  • AsyncTask Handler+线程池
  • Handler 安卓多线程基础组件

按照使用频率又少到高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值