返回介绍

四、AsyncTask 需要注意的坑

发布于 2024-12-23 22:31:12 字数 880 浏览 0 评论 0 收藏 0

  • 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文