当我们需要执行一些耗时的操作,比如说发起网络请求,考虑到服务器未必会立刻响应我们地请求,如果不将操作放置到子线程中就会导致主线程的阻塞,使得软件无法正常运行。
线程和主线程
线程是个单一执行序列,单个线程中的代码会逐步执行。所有Android应用的运行都是从主线程开始的。然而,主线程不是线程那样的预定执行序列,它处于一个无限循环的运行状态,等着用户或系触发事件。一旦有事件触发,主线程便执行代码作出响应。
主线程运行着所有更新UI的代码,其中包括响应activity的启动、按钮点击等不同UI相关事件的代码。由于响应的事件基本都与用户界面相关,主线程也叫UI线程。
Thread in Java
In java, a thread is represented by an object belonging to the subclass of java.lang.Thread and overrides its run() method, or a class that implements the Runnable interface, which has one method run().
The thread is created by instantiating the class Thread or the subclass of Thread. When the start() method of a thread object is invoked, it starts the concurrent execution of the thread along with the execution of its parent thread.
For example:
1 | new Thread(runnable).start(); |
Handler(消息处理)
Handler不仅仅是处理Message的target(目标),也是创建和发布Message的接口。
MessageQueue(线程使用的收件箱)
消息队列,用于存放所有通过Handler发送的消息,这部分消息会存在于消息队列中,等待被处理。每个线程只会有一个MessageQueue对象。
Looper(消息循环)
Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handerMessage()方法中。每个线程只有一个Looper对象。
Looper拥有Message对象的收件箱,所以Message必须在Looper上发布和处理。既然有这层关系,为了协同工作,Handler总引用着Looper,一个Handler仅与一个Looper相关联。一个Message也仅与一个目标Handler相关联。
Handler的使用
一般来讲,不应手动设置消息的目标Handler。创建信息时,最好调用Handler.obtainMessage(…)方法。传入其他必要消息字段后,该方法会自动设置目标Handler。
(我不知道我为什么抽风要把这个写上,因为一般都不是这么用的)
创建Handler对象
设置了3个int型常量,用来区分不同的事件。然后针对不同的事件来做相应的UI操作。这里主要是对RecyclerView的操作和会话列表数据加载完成后对加载动画的操作。
1 | private static final int DATA_CHANGED = 1;//数据集更新 |
1 | android.os.Message message = new android.os.Message(); |