Android 中执行异步任务
结论
由于人往往容易浮躁,那就先写结论。
最概括的结论
- 将一切(可能)耗时的操作都在非主(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 |