Android 中执行异步任务之 AsyncTask

特性

  • 从 Android API level 3 (Cupcake) 开始支持
  • API level 3 为单线程执行所有 AsyncTask,API level 4 (Donut) 至 API level 10 (Gingerbread) 为多线程,API level 11 (Honeycomb) 及以上默认单线程,可选多线程 + 直接支持向主线程发布结果(包括进度)
  • 每个 AsyncTask 在开始前和运行中都可以被 cancel +

由于人往往容易浮躁,那就先写结论。

最概括的结论

将一切(可能)耗时的操作都在非主(UI)线程中异步执行; 尽可能以单线程来执行异步任务以简化实现。

具体的结论

耗时操作分为

  • IO(常见,如数据库,网络)
  • CPU(不常见,耗时的运算)

异步执行任务的解决方案

  • AsyncTask
  • CursorLoader
  • AsyncQueryHandler
  • IntentService
  • 自定义 worker Thread

异步执行任务的 Best Practices

  • 对于数据库的访问(以 ContentProvider 的方式)应该使用 CursorLoader 和 AsyncQueryHandler 来异步执行
  • 对于其他需要伴随用户交互界面的耗时操作通常使用 AsyncTask 来异步执行
  • 对于需要在没有用户交互界面的时候进行的耗时操作可以使用 IntentService
  • 在以上方法都不能满足需求的情况下才考虑用自定义的 Thread 来异步执行任务

结论背后的细节

异步执行任务方案的细节统计

Solution Threading Thread Name Cancel Before Start Cancel In Progress
AsyncTask Single (default) AsyncTask # (1, 2, 3...) true true
CursorLoader Multiple AsyncTask # (1, 2, 3...) true true
AsyncQueryHandler Single AsyncQueryHandler true false
IntentService Single (for each service) IntentService["name"] false false