详解Android UI更新的几种方法

发布时间 - 2026-01-11 01:55:41    点击率:

前言

在android开发中,界面UI的更新都是在主线程来完成的。线程分为主线程(Main Thread,简称MT)和工作线程(Work Thread,简称WT),我们通常会在WT中执行一些比较耗时的操作,比如下载,网络,缓存等,然后在将结果发送给MT进行UI的更新操作。如果是在WT进行UI的更新,则会抛出异常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.(只有创建这个View的原始线程才能修改这个view)。

在BT搜索、WIFI搜索、其他需要更新View的UI过程中,很多是采用广播的方式通知搜索的结果,实时的显示到listview中进行UI的更新操作。通常会使用以下几种方式进行UI的更新:handler,runOnUiThread,子线程发送Message。

一、Activity.runOnUiThread

利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新 ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。

mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    Log.e(TAG, "开始添加设备!");
    addDevice(device);
  }
});

二、handler.post(Runnable)

handler.post(new Runnable() {
  @Override
  public void run() {
    addDevice(device);
  }
});

三、子线程发送Message

首先在需要执行更新的位置添加以下代码

new Thread(new Runnable() {
  @Override
  public void run() {
    //Message msg = new Message();
    //msg.what = 0x06;
    //handler.sendMessage(msg);
    handler.sendEmptyMessage(0x06);
  }
}).start();

然后进入handler下进行处理

final Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
    switch (msg.what) {
        case 0x06:
          addDevice(device);
        break;
      default:
        break;
    }
    super.handleMessage(msg);
  }
};

以上三种方法都可以实现UI的更新,掌握哪种方式取决于代码中的叠加度,不过个人推荐使用方法一。希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # UI更新  # UI更新方法  # Android 在其他线程中更新UI线程的解决方法  # android使用多线程更新ui示例分享  # Android异步更新UI的四种方式  # Android更新UI的四种方法详解  # Android 更新UI的方法汇总  # Android UI更新的几种方法总结  # 详解android进行异步更新UI的四种方式  # 是在  # 推荐使用  # 会在  # 能在  # 三种  # 几种  # 可以实现  # 哪种  # 来完成  # 则会  # 抛出  # 大家多多  # 通常会  # 过程中  # 发送给  # View  # br  # touch  # views  # hierarchy 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: zabbix利用python脚本发送报警邮件的方法  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  轻松掌握MySQL函数中的last_insert_id()  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  如何确认建站备案号应放置的具体位置?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  制作企业网站建设方案,怎样建设一个公司网站?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何用VPS主机快速搭建个人网站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  WordPress 子目录安装中正确处理脚本路径的完整指南  如何制作一个表白网站视频,关于勇敢表白的小标题?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  用v-html解决Vue.js渲染中html标签不被解析的问题  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何获取PHP WAP自助建站系统源码?  Android自定义控件实现温度旋转按钮效果  linux top下的 minerd 木马清除方法  如何用西部建站助手快速创建专业网站?  如何快速建站并高效导出源代码?  大连 网站制作,大连天途有线官网?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  高端建站如何打造兼具美学与转化的品牌官网?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Android 常见的图片加载框架详细介绍  如何在橙子建站上传落地页?操作指南详解  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  西安专业网站制作公司有哪些,陕西省建行官方网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在阿里云香港服务器快速搭建网站?  音响网站制作视频教程,隆霸音响官方网站?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  php 三元运算符实例详细介绍  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何用AI帮你把自己的生活经历写成一个有趣的故事?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】