Android 更新UI方法的深度解析

2023-11-18

1. Handler

public class SecondActivity extends Activity {  
    private static final int MSG_WHAT = 101;  
    TextView tv;  
    Button btn;  
    private MyHadler mHandler1;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main2);  
        tv = (TextView) findViewById(R.id.tv);  
        btn = (Button) findViewById(R.id.btn);  
        mHandler1 = new MyHadler();  
        btn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                updateUi();  
            }  
        });  
    }  
  
    class MyHadler extends Handler {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
                case MSG_WHAT:  
                    String str = (String) msg.obj;  
                    tv.setText(str);  
            }  
        }  
    };  
  
    /** 
     * 
     */  
    private void updateUi1() {  
        new Thread() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(5 * 1000);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                Message message = mHandler1.obtainMessage();  
                message.what = MSG_WHAT;  
                message.obj = "来自子线程的数据";  
                mHandler1.sendMessage(message);  
            }  
        }.start();  
    }  
}  

2.Handler的post()方法

private void updateUi2() {  
    new Thread() {  
        @Override  
        public void run() {  
            try {  
                Thread.sleep(5 * 1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            mHandler1.post(new Runnable() {  
                @Override  
                public void run() {  
                    tv.setText(" Handler.post更新UI");  
                }  
            });  
        }  
    }.start();  
}  

看看post()方法的源码

public final boolean post(Runnable r)  
   {  
      return  sendMessageDelayed(getPostMessage(r), 0);  
   }  

该方法调用了sendMessageDelayed(getPostMessage(r), 0)发送一条消息,下面首先看看 getPostMessage()方法

private static Message getPostMessage(Runnable r) {  
       Message m = Message.obtain();  
       m.callback = r;  
       return m;  
   } 

getPostMessage()方法是将Runnable对象转化为消息对象Message的callback属性。而sendMessageDelayed()方法就不多说 了,又回到Handler的处理机制了。

Handler的dispatchMessage()方法

public void dispatchMessage(Message msg) {  
      if (msg.callback != null) {  
          handleCallback(msg);  
      } else {  
          if (mCallback != null) {  
              if (mCallback.handleMessage(msg)) {  
                  return;  
              }  
          }  
          handleMessage(msg);  
      }  
  }  

可以看到,首先判断如果message的callback不等于null,则调用Handler的handleCallback()方法,否则调用Handler对象的handleMessage()方法。

3. Activity的runOnUiThread()方法

/** 
    * 通过runOnUiThread更新UI 
    */  
   private void updateUi3(){  
       new  Thread(){  
           @Override  
           public void run() {  
               try {  
                   Thread.sleep(3*1000);  
               } catch (InterruptedException e) {  
                   e.printStackTrace();  
               }  
               runOnUiThread(new Runnable() {  
                 @Override  
                 public void run() {  
                     tv.setText("runOnUiThread更新UI");  
                 }  
             });  
  
           }  
       }.start();  
   }  

 看看runOnUiThread()方法的源码

public final void runOnUiThread(Runnable action) {  
      if (Thread.currentThread() != mUiThread) {  
          mHandler.post(action);  
      } else {  
          action.run();  
      }  
  }  

4.View.post(Runnable r)方法

private void updateUi4(){  
       new Thread(){  
           @Override  
           public void run() {  
               super.run();  
               tv.post(new Runnable() {  
                   @Override  
                   public void run() {  
                       tv.setText("view post更新UI");  
                   }  
               });  
           }  
       }.start();  
   }  

 再来看看post()方法的源码

public boolean post(Runnable action) {  
    final AttachInfo attachInfo = mAttachInfo;  
    if (attachInfo != null) {  
        return attachInfo.mHandler.post(action);  
    }  
  
    // Postpone the runnable until we know on which thread it needs to run.  
    // Assume that the runnable will be successfully placed after attach.  
    getRunQueue().post(action);  
    return true;  
}  

 该方法还是调用了Handler的post()方法。Handler的post()方法很重要哦!

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 更新UI方法的深度解析 的相关文章

  • UI图片移动

    local x y 0 149 local run 0 local pi0 20 ui 图片2 右移动3 左移动4 ui 7266427303413860920 7266427303413860920 2 72664273034138609
  • 关于UI适配的文档

    第一部分 原理 1 根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数 1 XRatio 当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio 当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio XRatio与YRtaio中的较小值 2 之
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14

    刚开始学习QT在网上找的资料基本都是使用QT Create进行开发的 VS下开发的学习资料感觉很少很难找的到 视频教程也基本没看到过貌似 因为我们研发中心是使用MFC进行开发开发工具是VS2010 使用QT开发的话基本我们不会再使用QT C
  • QT QTableWidget 表格 学习笔记

    首先 了解一下QTableWidget 控件的属性 成员方法 功能 setText const QString text 设置单元格中的文本 setlcon const Qlcon icon 给单元格添加图标 setBackground c
  • sharedPreferences

    sharedpreferences 共享参数 也是保存数据的一种方法 通常用于持久化数据 定期更新保存数据 类似ajax的定时刷新 示例代码 主要来源于黑马教程 如下 import java util Timer import java u
  • xposed开发之清除应用数据(研究历程)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在研究xposed 有个需求要做到清除其他应用数据 xposed功能足够强大 应该可以实现这个功能 下面是基于android4 4 4研究的思路 google只能开放了
  • web移动端布局的那些事儿

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • HTTP协议简介,数据安全 如何保证http传输安全性,http与https区别

    目前大多数网站和app的接口都是采用http协议 但是http协议很容易就通过抓包工具监听到内容 甚至可以篡改内容 为了保证数据不被别人看到和修改 可以通过以下几个方面避免 重要的数据 要加密 比如用户名密码 我们需要加密 这样即使被抓包监
  • android Scroller

    参考 http www linuxidc com Linux 2016 01 127276 htm 以前只知道怎么使用scroller 照猫画虎 复制粘贴 今天遇到使用scroller 还是要去搜索 这样不行 要搞懂原理 上面的博客写的很漂
  • Compile Options--编译选项

    目的 其主要作用是用于调试跟踪和测试 主要包含 MT TASK MT ZDO FUNC and other MT compile options LCD SUPPORTED LCD SUPPORTED DEBUG BLINK LEDS 且看
  • QT之一个UI里边多界面切换

    QT之多界面交换 环境 VS2019 QT tools 从网上查看了许多大神的帖子 先将多界面切换的方法总结如下 1 可以通过QT Designer中添加Containers控件里的Stacked Widget实现同一个UI里的页面切换 可
  • 《OSPF和IS-IS详解》一1.7 独立且平等

    本节书摘来自异步社区 OSPF和IS IS详解 一书中的第1章 第1 7节 作者 美 Jeff Doyle 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 7 独立且平等 OSPF和IS IS详解与TCP IP相比 OSI协议对各国
  • 【QView】基于QML的UI组件框架 之 AImage (图片)

    先上结果演示 环境 不说版本就是耍流氓 硬件 通用PC 手机 Jetson Xavier NX 套件 均测试有效 系统 Ubuntu 20 04 Android Windows 均测试有效 软件 基于QT6 2 4 Qml 功能描述 AIm
  • 296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

    1 根因分析 根因分析 当有新版本并且grade等级是2的时候 点击ptz的时候使用的是RSDialog WA DeleteOnClose属性默认是为true的 并且是栈上的变量 当关闭ptz的时候 diolog的exec结束会向系统发送延
  • UI 易用性测试 以及自动化实现!

    GUI 是指图形用户界面 UI 是指用户界面 对于纯软件系统 这两者没有本质的区别 GUI易用性测试与 UI 易用性测试内容一致 但是如果测试的对象是一个产品 这两者则存在区别 对于产品 UI 则不仅仅包括 GUI 还包括产品硬件部分的测试
  • Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

    Axure RP 8 一款引领潮流的交互式原型设计工具 为设计师提供了无限的可能性 让他们能够创造出逼真的原型 从而更好地展示和测试他们的设计 Axure RP 8拥有丰富的功能和工具 让设计师可以轻松地创建出复杂的交互式原型 从简单的按钮
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • OpenHarmony沙箱文件

    一 前言 1 前景提要 DevEcoStudio版本 DevEco Studio 3 1 Release SDK版本 3 2 2 5 API版本 9 2 概念 在openharmony文件管理模块中 按文件所有者分类分为应用文件和用户文件和
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM

随机推荐