在学习Handler的过程中牵涉到UI的更新,在这里就总结一下更新UI的四种方式吧,用法都比较简单,直接看代码就可以了。

一、使用Handler的post方法

新建项目,修改MainActivity代码,如下:

  1. package com.example.handldertest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.widget.TextView;
  7.  
  8. public class UpdateUIActivity extends Activity{
  9.  
  10. private TextView tv;
  11. private Handler handler = new Handler();
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. tv = new TextView(this);
  15. tv.setText("你好");
  16. setContentView(tv);
  17.  
  18. handler.post(new Runnable(){
  19. @Override
  20. public void run() {
  21. tv.setText("handler post");
  22. }
  23. });
  24. }
  25.  
  26. }

我们可以看到,如果不改变tv显示的文本信息,那么它应该显示”你好“两个字。但是我们使用了handler的post方法,这样子运行程序,就会将文本改为”handler post"。比较简单,我就不贴图了。

二、使用Handler的sendMessage方法

修改MainActivity的代码如下:

  1. package com.example.handldertest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.widget.TextView;
  7.  
  8. public class UpdateUIActivity extends Activity{
  9.  
  10. private TextView tv;
  11. private Handler handler = new Handler(){
  12. public void handleMessage(android.os.Message msg) {
  13. tv.setText("handler msg");
  14. };
  15. };
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. tv = new TextView(this);
  19. tv.setText("你好");
  20. setContentView(tv);
  21.  
  22. handler.sendEmptyMessage(1);
  23. }
  24.  
  25. }

运行程序,发现文本信息被改为“handler msg"。

三、使用runOnUiThread

Activity类提供了一个final类型的方法,即runOnUiThread,参数就是一个Runnable。这样子可以通过它来更新UI。修改MainActivity,如下:

  1. package com.example.handldertest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.widget.TextView;
  7.  
  8. public class UpdateUIActivity extends Activity{
  9.  
  10. private TextView tv;
  11.  
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. tv = new TextView(this);
  15. tv.setText("你好");
  16. setContentView(tv);
  17.  
  18. runOnUiThread(new Runnable(){
  19. @Override
  20. public void run() {
  21. tv.setText("runOnUiThread");
  22.  
  23. }
  24. });
  25.  
  26. }
  27.  
  28. }

运行程序,发现文本信息被改成”runUiThread"。

四、view.post方法

每一个view都有自己的post方法,其参数就是一个Runnable对象。在这里也可以进行更新UI的操作,修改MainActivity代码如下:

  1. package com.example.handldertest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.widget.TextView;
  7.  
  8. public class UpdateUIActivity extends Activity{
  9.  
  10. private TextView tv;
  11.  
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. tv = new TextView(this);
  15. tv.setText("你好");
  16. setContentView(tv);
  17.  
  18. tv.post(new Runnable(){
  19. public void run() {
  20. tv.setText("tvpost");
  21. };
  22. });
  23.  
  24. }
  25.  
  26. }

运行程序,发现文本信息被改为“tvpost"。

在这里我插一句,你可以想象成view的post是在view被绘制完成后被自动调用。因此我们可以在这个方法中获得view的宽和高等执行一个其他的逻辑。因为在onCreate方法中直接获得tv的宽和高,肯定为0值,此时tv还没被画出来呢。

好了,以上即是四种常用的更新UI的方式,其实如果你翻看源代码,你就会发现每一种的原理都是基于第二种方式,即Handler发送消息来更新。只不过它们都做了相应的封装而已。

更新UI的几种方式的更多相关文章

  1. Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

  2. UI的线程问题:单线程原因及更新UI的四种方式

    1.UI线程为什么设计为单线程? UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致: UI控件的操作变得很复杂. 加锁的操作必定会导致效率下降. 所以android系统在 ...

  3. Android 更新UI的几种方式

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...

  4. Android更新UI的几种方式

    之前做过一个Android采集心电图数据的程序,那才是真正的多线程,之前写的小程序:比如下载个文件,从socket接受大一点的数据流然后在ui上更新进度,我都感觉这就叫做多线程了,其实这啥都不算,用个 ...

  5. Android通过子线程更新UI的几种方式

    一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...

  6. Android开发更新UI的几种方式

    1.runOnUiThread 2.handler post 3.handler sendmessage 4.view post xml布局文件: <RelativeLayout xmlns:a ...

  7. Android:在子线程中更新UI的三种方式

    ①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLo ...

  8. [UE4]更新UI的三种方式

    一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...

  9. Android 中更新 UI 的四种方式

    runOnUiThread handler 的 post handler 的 sendMessage View 自身的 post

随机推荐

  1. Map集合遍历的4种方法

    完全复制https://www.cnblogs.com/blest-future/p/4628871.html import java.util.HashMap; import java.util.I ...

  2. Access入门 2010,数学

    Access入门 2010(高级窗体) 1,创建数据透视图:创建---其他窗体---数据透视图---图标字段列表---选择列表内容---移动到数据透视图的对应位置---完成. 2,创建数据透视表窗体: ...

  3. Lucene学习之四:Lucene的索引文件格式(1)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html Lucene的索引里面存了些什么,如何存放的,也即 ...

  4. shiro权限控制入门

    一:权限控制两种主要方式 粗粒度 URL 级别权限控制和细粒度方法级别权限控制 1.粗粒度 URL 级别权限控制 可以基于 Filter 实现在数据库中存放 用户.权限.访问 URL 对应关系, 当前 ...

  5. Linux下查看Tomcat的控制台输出信息

    Linux下查看Tomcat的控制台输出信息 首先使用SSH连接到数据库,然后点击window创建一个new terminal, 进入tomcat/logs/文件夹下,输出控制台信息,命令如下: cd ...

  6. sun.misc.unsafe

    Java中大部分错误都是基于内存管理方面的.如果想破坏,可以使用Unsafe这个类. 实例化Unsafe: 下面两种方式是不行的 private Unsafe() {} //私有构造方法 @Calle ...

  7. Service的启动流程源码跟踪

    前言: 当我们在一个Activity里面startService的时候,具体的执行逻辑是怎么样的?需要我们一步步根据源码阅读. 在阅读源码的时候,要关注思路,不要陷在具体的实现细节中,一步步整理代码的 ...

  8. JavaScript Set Homepage and Favorite

    // JavaScript Set Homepage and Favorite // <a href="javascript:AddFavorite(window.location,d ...

  9. window onload || jquery $()

    1.window 的 onload 机制只指定一个函数,且在页面DOM及静态资源加载完之后执行: window.onload = function(){ alert(); } 2.$(document ...

  10. 12_Redis缓存穿透

    [何为缓存穿透] 缓存穿透是查询一个一定不存在的数据,这样的请求都要到存储层MySql去查询,失去了缓存的意义,在流量大时,可能MySql就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是 ...