Open huanzhiyazi opened 4 years ago
目录
在 android 开发中,Handler 通常用于 UI 线程与工作线程之间的通信。由于 UI 线程的高实时性要求,我们必须将一些 IO 或者高计算量的任务分派给一个独立的工作线程去运行,这样在 UI 线程与工作线程之间就需要某种方式来进行通信,比如告知 UI 线程任务的完成情况。Handler 就是为此目的而实现。
在 android 系统的早期版本,Handler 的使用频率相当高,即便是当初用的非常普遍的 AsyncTask,其内部实现也需要 Handler 充当通信桥梁。此外,像 IntentService 也是基于此实现。
如果不谈繁琐的源代码细节,总体来说,Handler 实现线程间通信是基于生产者-消费者模型。
一个简单的生产者-消费者模型如下图所示:
在该模型中,有 4 个主要的角色:
Handler 继承了生产者-消费者模型的思想,如下图所示:
其要点如下:
以上基本上就是 Handler 的实现思想。剩下还有两个点需要注意一下:
Looper
ThreadLocal
public final class Looper { // ... static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); // ... public static void prepare() { prepare(true); } private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } // 初次实例化,保证一个 thread 只有一个 looper sThreadLocal.set(new Looper(quitAllowed)); } // ... public static @Nullable Looper myLooper() { // 每次都返回的 Looper 都已经被某个消费者线程绑定了,这样 Looper 的所有操作都限定在这个线程里 return sThreadLocal.get(); } // ... }
Java Concurrency In Practice
Part II Structuring Concurrent Applications / GUI Appliacations
目录
1 Handler 简介[Top]
在 android 开发中,Handler 通常用于 UI 线程与工作线程之间的通信。由于 UI 线程的高实时性要求,我们必须将一些 IO 或者高计算量的任务分派给一个独立的工作线程去运行,这样在 UI 线程与工作线程之间就需要某种方式来进行通信,比如告知 UI 线程任务的完成情况。Handler 就是为此目的而实现。
在 android 系统的早期版本,Handler 的使用频率相当高,即便是当初用的非常普遍的 AsyncTask,其内部实现也需要 Handler 充当通信桥梁。此外,像 IntentService 也是基于此实现。
如果不谈繁琐的源代码细节,总体来说,Handler 实现线程间通信是基于生产者-消费者模型。
2 简单的生产者-消费者模型[Top]
一个简单的生产者-消费者模型如下图所示:
在该模型中,有 4 个主要的角色:
3 Handler 中的生产者-消费者模型[Top]
Handler 继承了生产者-消费者模型的思想,如下图所示:
其要点如下:
4 一些思考[Top]
以上基本上就是 Handler 的实现思想。剩下还有两个点需要注意一下:
Looper
类,它通过ThreadLocal
,用线程本地化操作的方式,将自己绑定到当前的消费者线程。Java Concurrency In Practice
这本书的Part II Structuring Concurrent Applications / GUI Appliacations
这一章。