- CompoundButton 源码分析
- LinearLayout 源码分析
- SearchView 源码解析
- LruCache 源码解析
- ViewDragHelper 源码解析
- BottomSheets 源码解析
- Media Player 源码分析
- NavigationView 源码解析
- Service 源码解析
- Binder 源码分析
- Android 应用 Preference 相关及源码浅析 SharePreferences 篇
- ScrollView 源码解析
- Handler 源码解析
- NestedScrollView 源码解析
- SQLiteOpenHelper/SQLiteDatabase/Cursor 源码解析
- Bundle 源码解析
- LocalBroadcastManager 源码解析
- Toast 源码解析
- TextInputLayout
- LayoutInflater 和 LayoutInflaterCompat 源码解析
- TextView 源码解析
- NestedScrolling 事件机制源码解析
- ViewGroup 源码解析
- StaticLayout 源码分析
- AtomicFile 源码解析
- AtomicFile 源码解析
- Spannable 源码分析
- Notification 之 Android 5.0 实现原理
- CoordinatorLayout 源码分析
- Scroller 源码解析
- SwipeRefreshLayout 源码分析
- FloatingActionButton 源码解析
- AsyncTask 源码分析
- TabLayout 源码解析
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
四、AsyncTask 需要注意的坑
- AsyncTask 的对象必须在主线程中实例化,execute 方法也要在主线程调用(查看 3.1 节-AsyncTask 构造函数)
- 同一个 AsyncTask 任务只能被执行一次,即只能调用一次 execute 方法,多次调用时将会抛异常(查看 3.2 里面的第二小节)
- cancel() 方法无法直接中断子线程,只是更改了中断的标志位。控制异步任务执行结束后不会回调 onPostExecute()。正确的取消异步任务要 cancel() 方法+doInbacground() 做判断跳出循环
- AsyncTask 在 Activit 通常作为匿名的内部类来使用,如果 AsyncTask 中的异步任务在 Activity 退出时还没执行完或者阻塞了,那么这个保持的外部的 Activity 实例得不到释放(内部类保持隐式外部类的实例的引用),最后导致会引起 OOM,解决办法是:在 AsyncTask 使用弱引用外部实例,或者保证在 Activity 退出时,所有的 AsyncTask 已执行完成或被取消
- 会产生阻塞问题,尤其是单任务顺序执行的情况下,一个任务执行时间过长会阻塞其他任务的执行
- 不建议使用 AsyncTask 进行网络操作
AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs。
Android 文档中有写到 AsyncTask 应该处理几秒钟的操作(通常为轻量的本地 IO 操作),由于网络操作存在不确定性,可能达到几秒以上,所以不建议使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论