Android中的UI更新

来源:互联网 发布:广联达软件配置要求 编辑:程序博客网 时间:2024/06/05 23:57

刚刚接触Android不久,看了一些别人的源码,发现里面Handler类用得非常频繁。系统地看了一些android的教程以后,发现android里实时更新UI界面真的还是设计的很巧妙,今天来总结一下。

出于性能优化考虑,android的UI操作并不是线程安全的。就是说多个线程并发操作UI组件时,可能导致线程安全问题。比如说有个列表组件,使用了一个ArrayList作为Adapter,而这个ArrayList是会在其他线程里更新的。当UI线程去取列表项的值来进行显示时,如果所取的项刚好被另一个线程删除了,此时就会产生数组访问越界的异常,导致程序崩溃。为此,android指定了一条简单的规则:只允许UI线程修改Activity里的UI组件。

重要的话说两遍:android里只允许UI线程修改Activity里的UI组件。

当一个程序第一次启动时,android会自动启动一条主线程,负责处理与UI相关的事件,这就是我们常说的UI线程。上面的规则就是说,只允许这个UI线程来对UI组件进行更新。那在多线程程序里,其他线程要对UI组件进行更新,应该怎么办呢?其中的一个方法就是使用Handler。

Handler说起来其实很简单,主要作用就两个:一个是在新启动的线程中发送消息。另一个是在创建Handler的线程中获取和处理消息。

我们来看Handler是怎么用在UI更新上的。我们在UI线程里创建一个Handler,主要需要实现一下它的handleMessage方法。这个方法里实现的就是我们的具体任务,根据收到的消息来对UI组件进行更新。注意这是一个回调方法,就是由系统自动调用的。我们要做的,是在另一个线程中想要更新UI组件时,因为它不能直接更新UI组件,因此它要做的,只是使用这个Handler发送一条消息,通过消息来通知handleMessage方法,在主线程里对UI组件进行更新操作。

因此Handler主要做两件事,在其他线程发送消息,在主线程里处理消息,进行UI更新操作。

Handler机制的具体实现细节,主要依赖三个类。
Message:Handler处理的消息类。
MessageQueue:消息队列,负责保存当前线程接收到的消息。
Looper:每个线程的循环类,负责不断地从MessageQueue中获取消息,并分发给对应的Handler去处理。
MessageQueue类是由Looper类管理的,在Looper对象创建时自动创建MessageQueue对象。而Looper对象在每个线程只有一个,UI线程的Looper对象由android系统自动创建。而用户自己启动的其他线程,则需要用户通过调用Looper.prepare()方法自己来创建Looper对象,并使用Looper.loop()来启动消息循环。

弄懂了Handler的原理以后,我们可以举一反三,学习一下android的这种线程安全做法。就是Handler类不光可以用在UI更新上,还可以用在其他我们希望线程安全的操作上。比如维护一个数据库,我们也可以只允许某一个线程A来操作数据库。其他线程想要操作数据库,只能通过Handler发送消息的方式,在线程A中的handleMessage方法中执行具体的操作。

0 0