在 doInBackground() 中访问视图是不好的做法吗?

Is it bad practice to access a view in doInBackground()?

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

它不是很好,原因很简单,你不知道那个小部件是否有用了。

假设发生以下情况:

  • 您执行了 AsyncTask,但它滞后于其他任务,不会立即 运行
  • 用户旋转屏幕,或按BACK,或以其他方式破坏activity
  • 您的 AsyncTask 终于开始 运行ning 并且您尝试访问此小部件

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

AsyncTask 本身已经过时了;现代 Android 开发使用其他东西(LiveData、RxJava 和 Kotlin 协程是最大的候选者)。但是,如果您希望使用 AsyncTask,请确保它不会尝试从 doInBackground().

引用 activity 或其小部件