gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:06:54 25 4
gpt4 key购买 nike

我知道 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com