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

一、使用Handler的post方法

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

 package com.example.handldertest;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView; public class UpdateUIActivity extends Activity{ private TextView tv;
private Handler handler = new Handler();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("你好");
setContentView(tv); handler.post(new Runnable(){
@Override
public void run() {
tv.setText("handler post");
}
});
} }

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

二、使用Handler的sendMessage方法

修改MainActivity的代码如下:

 package com.example.handldertest;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView; public class UpdateUIActivity extends Activity{ private TextView tv;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
tv.setText("handler msg");
};
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("你好");
setContentView(tv); handler.sendEmptyMessage(1);
} }

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

三、使用runOnUiThread

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

 package com.example.handldertest;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView; public class UpdateUIActivity extends Activity{ private TextView tv; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("你好");
setContentView(tv); runOnUiThread(new Runnable(){
@Override
public void run() {
tv.setText("runOnUiThread"); }
}); } }

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

四、view.post方法

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

 package com.example.handldertest;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView; public class UpdateUIActivity extends Activity{ private TextView tv; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("你好");
setContentView(tv); tv.post(new Runnable(){
public void run() {
tv.setText("tvpost");
};
}); } }

运行程序,发现文本信息被改为“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. freemarker实现通用布局的模板拆分与复用

    原文:http://www.hawu.me/coding/733 一.基础页面布局 假设我们项目页面的通用布局如下图所示: 实现这样的布局的基本html代码如下:           XHTML   ...

  2. Silverlight & Blend动画设计系列九:动画(Animation)与视图状态管理(Visual State Manager)

    Silverlight中的动画(Animation)与视图状态管理(Visual State Manager) 结合使用是非常常见的,动画用于管理对象在某段事件段内执行的动画动作,视图状态管理则用于控 ...

  3. JavaScript中变量声明以及数据类型

    JavaScript变量 变量名必须以字母或下划线("_")开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做) 变量名称对大小写敏感(y 和 Y 是不同的变量) 变量可 ...

  4. IDEA创建一个Spring MVC 框架Java Web项目,Gradle构建

    注:此篇有些细节没写出,此文主要写重要的环节和需要注意的地方,轻喷 新建项目 选择Gradle , 勾选java 和 web.之后就是设定项目路径和名称,这里就不啰嗦了. build.gradle文件 ...

  5. [android] 界面的划分

    1.统一界面管理 1.1利用一个activity去管理应用的所有的界面 1.1.1 理解Activity,Window和View之间的关系 1.1.2 避免Activity过多导致的问题, 例如:彻底 ...

  6. Java基础(三)选择和循环结构

    一.选择结构,条件判断 1.if 语句 一个 if 语句包含一个布尔表达式和一条或多条语句.如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码. impor ...

  7. Error:All flavors must now belong to a named flavor dimension.

    环境 android studio 3.0 错误 Error:All flavors must now belong to a named flavor dimension. 解决 在build.gr ...

  8. 【原创】Hadoop的IO模型(数据序列化,文件压缩)

    数据序列化 我们知道,数据在分布式系统上运行程序数据是需要在机器之间通过网络传输的,这些数据必须被编码成一个个的字节才可以进行传输,这个其实就是我们所谓的数据序列化.数据中心中,最稀缺的资源就是网络带 ...

  9. 使用PowerShell批量解除锁定下载的文件

    使用PowerShell批量解除锁定下载的文件 3.在需要解锁的文件所在的文件夹中空白处,按住Shift然后单击右键,在弹出的右键菜单中,选择“在此处打开PowerShell窗口”, 输入Get-Ch ...

  10. mysql中的find_in_set的使用

    原文 http://www.php-note.com/article/detail/383 举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文... ...