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方法的深度解析 的相关文章

  • sharedPreferences

    sharedpreferences 共享参数 也是保存数据的一种方法 通常用于持久化数据 定期更新保存数据 类似ajax的定时刷新 示例代码 主要来源于黑马教程 如下 import java util Timer import java u
  • 你与小程序开发的距离有多远?

    你与小程序开发的距离有多远 2017年1月9日凌晨 小程序正式发布 对焦10年前iPhone的发布时间 产品之神张小龙显然是想让这一天具有十分重要的历史意义 小程序发布之后 它终于揭开了最终面目 我们不得不承认 这一天 必定是一个新时代的开
  • xposed开发之清除应用数据(研究历程)

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

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • 史上最全的《Android面试题及解析》,赶紧收藏!

    写在文章前面的话 工欲行其事 必先利其器 英雄和侠客更需要宝剑助己成功 同样 在现代软件开发环境中 每个Android开发者都需要更好的工具 帮助我们增强功能 提高效率 在这个竞争激烈的行业中 只有优秀的工程师能够生存 需要我们能够为客户提
  • android-smart-image-view源码分析,android性能优化推荐书

    三 源码分析 从github上clone该项目 可以看到整个项目的代码只包含7个Java源文件 同时 还可进行扩展 方便使用者根据实际图片的来源进行扩展 我们来看看Class逻辑图 上面有提到 SmartImageView继承自ImageV
  • HTTP协议简介,数据安全 如何保证http传输安全性,http与https区别

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

    目的 其主要作用是用于调试跟踪和测试 主要包含 MT TASK MT ZDO FUNC and other MT compile options LCD SUPPORTED LCD SUPPORTED DEBUG BLINK LEDS 且看
  • Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)

    在进行UI设计时 我们经常需要将屏幕设置成无标题栏或者全屏 要实现起来也非常简单 主要有两种方法 配置xml文件和编写代码设置 1 在xml文件中进行配置 在项目的清单文件AndroidManifest xml中 找到需要全屏或设置成无标题
  • ios -Unity3D的EasyAR集成到已经有项目中。

    近期 在做AR这一块 用EasyAR集成到iOS端 由于现在到项目已经上线 下一版本要做一个AR功能 于是迫于需求需要 自己研究和翻阅读好多集成到资料 通过整理分出几个重要到模块 其中在这里指出Xcode9版本确实好坑 建议弃坑 该用稍微好
  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • React 教程及其API接口文档

    React 详细中文开发文档 可以阅读 http reactjs cn react docs tutorial html 英文原文 http facebook github io react 中文论坛 http react china or
  • 【UI自动化测试】Jenkins配置

    前一段时间帮助团队搭建了UI自动化环境 这里将Jenkins环境的一些配置分享给大家 背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测
  • UI自动化测试方案

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 3k次 点赞60次 收藏8次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自动
  • 独立搭建UI自动化测试框架分享

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

    在 弹窗 的标签中加入append to body即可解决该问题
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • OpenHarmony沙箱文件

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

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

    在UI的自动化测试中 我们需要把测试使用到的数据分离到文件中 如果单纯的写在我们的测试模块里面 不是一个好的设计 所以不管是什么类型的自动化测试 都是需要把数据分离出来的 当然分离到具体的文件里面 文件的形式其实有很多的 这里主要说明JSO

随机推荐