How to process concurrent?

With asynchronous operations, the system can share the execution among multiple CPUs and therefore increase throughput. 通过异步操作,系统可以共享多个CPU之间的执行,从而提高吞吐量。

To increase performance, an application should split operations among several threads so that the code is executed concurrently. Every Android App contains a specific thread that is responsible for updating the UI. All long operations should be kept off the UI thread and executed on other threads.

UI Thread 被称作主线程,其机制是一个消息循环队列,所有用户的操作、其它线程发送给 UI 线程的消息都被发送到该队列,被一个个处理。这也是为什么 UI 线程不能做耗时操作。所有耗时操作都必须另起线程。这就是并发了。

很多情况下,比如网络操作(否则会抛出异常)、IO 操作,必须在后台 Service 进行。因为在执行这些耗时操作时用户可能切换到其它 App,当内存紧张时 Android 可能会销毁进驻后台的 Activity ,相关的数据也会被销毁,所以线程不能和 Activiy 等 UI 组件绑定在一起。而 Service 可以常驻后台,虽然 Service 也属于 UI 线程,但是我们可以在 Service 中启动 work thread。

Android Framework 提供了一个 Service 类叫做 IntentService,它在内部已经实现了一个 work thread,同 UI thread 类似,也维护着一个消息循环队列,不同的是,所有的消息都在 work thread 中被处理,不会阻塞 UI Thread。所以 IntentService 很适合实现一些简单的并发任务,比如 Photo Galaxy App 在后台定时查询是否有照片更新。

Android Framework 提供的另一个工具类 AsyncTask,可以并行,也可以顺序。实践中常多用于简单且耗时少的任务,比如从网站下载一份xml文件,包含最新的照片、天气信息等,可以在 doInBackGround 中下载并解析数据,在 onPostExecute 中把数据更新到 UI 上。不需要额外的手段传输数据。但其内部实现依然是 Handler Message 消息处理机制。

Android 线程之间通信(数据传输)要通过消息机制。

我在开发中使用到这些组件的场景: