在 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 或其小部件
将 UI 元素(例如 TextView
)传递给 AsyncTask.doInBackground()
(通过 AsyncTask.execute()
)并传递给 是不好的做法吗 来自后台线程视图的字段? (我知道从后台线程更改 GUI 元素是不对的。)
它不是很好,原因很简单,你不知道那个小部件是否有用了。
假设发生以下情况:
- 您执行了
AsyncTask
,但它滞后于其他任务,不会立即 运行 - 用户旋转屏幕,或按BACK,或以其他方式破坏activity
- 您的
AsyncTask
终于开始 运行ning 并且您尝试访问此小部件
在最好的情况下,小部件完全是错误的。在最坏的情况下,无论您调用什么都会导致某种崩溃,因为托管 activity 已被破坏。
AsyncTask
本身已经过时了;现代 Android 开发使用其他东西(LiveData
、RxJava 和 Kotlin 协程是最大的候选者)。但是,如果您希望使用 AsyncTask
,请确保它不会尝试从 doInBackground()
.