java - 在非 UI 线程上实例化 View

标签 java android android-asynctask android-ui android-view

我知道 UI 元素( View 层次结构)只能从 UI 线程进行操作。对于后台操作,可以使用 AsyncTask,它提供到达 UI 线程的事件处理程序。

简而言之,是否允许在非 UI 线程中实例化 View (绑定(bind)到 getApplicationContext())?此自定义 View 后代 - 一旦实例化 - 从 UI 线程 添加到 View 层次结构。因此只有构造函数调用是在 Asynctask.doInBackground() 中完成的;它附加 (addView(...)) 到 Activity 的根布局层次结构仍然在 UI 线程中完成。

详细信息:

public MyView extends View {
     public MyView(Context context) { 
            ...
     }
...
}
  1. 我制作了一个自定义 View ,覆盖了 onDraw(...)

  2. 当用户点击我的主 Activity 中的某个 MenuItem 时,会创建另一个 Activity (MyOtherActivity) 并显示哪个屏幕正是 MyView

  3. 由于 MyOtherActivity 的屏幕必须立即显示,我在 AsyncTask 中预实例化 MyView,而用户在主 Activity 中的其他地方(即他还没有单击该 MenuItem)。 MyView 引用存储在静态数据成员中。

  4. 当调用 MyOtherActivity.onCreate() 时,其构造函数代码从静态中获取 MyView,并通过 addView(...)< 将其添加到其布局根层次结构中.

  5. (我知道静态变量可能会引入内存泄漏,所以我在不需要时将其设置为null。)

MyView 在不同的线程中实例化(并在其构造函数中获取 getApplicationContext() 的返回值)不是一个问题(并且可能会引入意外问题)吗?

最佳答案

最终答案出现在 View 的文档中,在“事件处理和线程”标题下:

Note: The entire view tree is single threaded. You must always be on the UI thread when calling any method on any view. If you are doing work on other threads and want to update the state of a view from that thread, you should use a Handler.

因此,不仅仅是那些明显影响 UI 外观的东西,例如 addView(),而是 any View 上的“any 方法” ".

discussion on android-developers与@CommonsWare 相关联的不止一位来自 Android 框架团队的高级工程师确认这是要认真对待的。

关于java - 在非 UI 线程上实例化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215302/

相关文章:

java - 使用 Apache POI 设置 xls 文件中注释工具提示的位置

java - java中2组的最接近和

java - 读取 firebase DB 后如何更改 ListView 上的颜色和字体

android - 错误的IDE Android Studio

java - Android Google Maps API,防止在屏幕方向更改时重新加载/重绘 map

Android:如何使用 Volley 从方法返回异步 JSONObject?

android - 如何在开始新 Activity 时放置进度条

java - AsyncTask 是一个内部类 : get onPostExecute() result in Service

java - 通过按钮更改按钮的 onClick() 方法

android - 应用程序上的 FCM 已关闭