文档章节

使用异步消息处理更新UI线程

 红豆与绿豆
发布于 2015/10/08 09:45
字数 570
阅读 29
收藏 1

1. AndroidUI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃。

为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象,使用Handler发送出去,然后在HandlerhandleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作)。所以说还是很有必要了解异步消息机制的Looper , Handler , Message等原理的。

下面展示一个示例使用,然后通过源码分析吧。

public class MainActivity extends Activity {
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Button changeText;
    private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case UPDATE_TEXT:
                text.setText("Nice yo see you again");
                break;
            default:
                break;
        }
    }
};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        changeText = (Button) findViewById(R.id.change_text);
//        changeText.setOnClickListener(this);
        changeText.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                switch ((view.getId())){
                    case R.id.change_text:
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
//                                若直接更新TextView的内容会报错,下面使用异步消息处理机制
//                                text.setText("Nice to see you,BUG");
                                Message message = new Message();
                                message.what = UPDATE_TEXT;
                                handler.sendMessage(message);
                            }
                        }).start();
                        break;
                    default:
                        break;
                }
            }
        });
    }
}

这里我们先是定义了一个整型常量UPDATE_TEXT,用于表示更新TextView 这个动作。然后新增一个Handler 对象,并重写父类的handleMessage 方法,在这里对具体的Message进行处理。如果发现Message what 字段的值等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again

下面再来看一下Change Text 按钮的点击事件中的代码。可以看到,这次我们并没有在子线程里直接进行UI 操作,而是创建了一个Messageandroid.os.Message)对象,并将它what 字段的值指定为UPDATE_TEXT,然后调用Handler sendMessage()方法将这Message 发送出去。很快,Handler 就会收到这条Message,并在handleMessage()方法中对它进行处理。注意此时handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可以放心地在这里进行UI 操作。接下来对Message 携带的what 字段的值进行判断,如果等于UPDATE_TEXT,就将TextView 显示的内容改成Nice to see you again

常用的APP在线自动化测试工具:www.ineice.com


© 著作权归作者所有

粉丝 3
博文 49
码字总数 21798
作品 0
南昌
私信 提问
AsyncTask 的实现原理

在《Android异步处理二:使用AsyncTask异步更新UI界面》一文中,我们介绍了如何使用AsyncTask实现异步下载图片,并且更新图片到UI界面的方法。本篇我们将学习Framework层AsyncTask的实现原理...

鉴客
2011/09/17
7.8K
1
说说在 Android 中如何实现多线程编程

当我们执行一些耗时操作,比如发起一条网络请求时,考虑到网速等其他因素,服务器未必会立刻响应我们的请求,那么就必须将这类操作放在子线程中运行,这就需要实现多线程编程。 1 启动线程 ...

deniro
2018/06/18
0
0
Android handler机制

关键对象:Handler,Looper,Message,MessageQueue handler机制用于ui的异步更新。我们无法在非ui线程里面修改ui元素。这点同游戏开发是一样的,或许是出于安全和性能方面的考虑(如果异步线程...

yizhangxyz
2016/12/19
12
0
Android异步消息处理机制完全解析-Handler详解

参考资料 - 官方介绍文档 - Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 - Android异步消息处理机制完全解析,带你从源码的角度彻底理解 - 慕课网课程-Androi...

javen205
2017/03/25
0
0
Android多线程的四种方式

当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过...

天王盖地虎626
06/12
52
0

没有更多内容

加载失败,请刷新页面

加载更多

Centos7 python2.7和yum完全卸载及重装

                                     完全重装python和yum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1、删除现有...

roockee
24分钟前
5
0
【软件工程】绪论,深入浅出理解软件工程

软件和软件工程 什么是软件工程 软件工程是贯穿整个软件生命周期的工程学和方法论及其使用的工具(我说的) 软件工程要解决那些问题 软件的研发周期过长 软件开发成本居高不下 软件在交付之前...

丌官尚雄
31分钟前
5
0
无回路有向图的拓扑排序

因公司业务需要,在表单中每个字段都会配置自动计算,但自动计算公式中会引用到其他字段中的值。所以希望可以根据计算公式,优先计算引用的公式。所以最终使用了无回路有向图的扩扑排序来实现...

兜兜毛毛
今天
7
0
如何抢占云栖大会C位?史上最强强强攻略来了

点击观看视频: APSARA云栖大会开发者情怀 原文链接 本文为云栖社区原创内容,未经允许不得转载。

阿里云官方博客
今天
6
0
Kubernetes 从懵圈到熟练:集群服务的三个要点和一种实现

作者 | 声东 阿里云售后技术专家 文章来源:Docker,点击查看原文。 以我的经验来讲,理解 Kubernetes 集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务...

阿里巴巴云原生
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部