首页 > 解决方案 > 在 doInBackground() 中访问视图是不好的做法吗?

问题描述

将 UI 元素(例如 a TextView、 )传递给AsyncTask.doInBackground()(通过AsyncTask.execute())并从后台线程中的视图中读取字段是不好的做法吗?(我知道从后台线程更改 GUI 元素是不行的。)

标签: androidandroid-asynctaskandroid-threading

解决方案


这不是很好,原因很简单,您不知道该小部件是否有任何好处。

假设发生以下情况:

  • 您执行了AsyncTask,但它卡在了其他任务后面并且没有立即运行
  • 用户旋转屏幕,或按下 BACK,或以其他方式破坏活动
  • AsyncTask终于开始运行并尝试访问此小部件

在最好的情况下,小部件完全是错误的。在最坏的情况下,无论您调用什么都会导致某种崩溃,因为托管活动被破坏了。

AsyncTask本身已经相当过时了;现代 Android 开发使用其他东西(LiveDataRxJava 和 Kotlin 协程是最大的候选者)。但是,如果您希望使用AsyncTask,请确保它不会尝试从 引用活动或其小部件doInBackground()


推荐阅读