我知道 UI 元素(视图层次结构)只能从 UI 线程进行操作。对于后台操作,可以使用 AsyncTask,它提供事件处理程序来到达 UI 线程。
简而言之,是否允许实例化视图(绑定到getApplicationContext()
) 在非 UI 线程中?这个自定义视图后代——一旦实例化——就会被添加到视图层次结构中用户界面线程。所以只有构造函数调用是在一个内部完成的Asynctask.doInBackground()
;它正在附加(addView(...)
)到 Activity 的根布局层次结构仍然在 UI 线程中完成。
详细信息:
public MyView extends View {
public MyView(Context context) {
...
}
...
}
我做了一个自定义视图,并覆盖了onDraw(...)
etc.
当用户单击我的主 Activity 中的某个 MenuItem 时,会创建并显示另一个 Activity (MyOtherActivity)哪个屏幕正是 MyView
由于 MyOtherActivity 的屏幕必须立即显示,因此当用户位于主 Activity 中的其他位置时(即,他尚未单击该 MenuItem),我在 AsyncTask 中预先实例化 MyView。 MyView 引用存储在静态数据成员中。
When MyOtherActivity.onCreate()
被调用时,它的构造函数代码从静态中获取 MyView,并通过以下方式将其添加到其布局根层次结构中:addView(...)
.
(我知道静态变量可能会引入内存泄漏,所以我将其设置为null
一旦不需要。)
MyView 在不同的线程中实例化(并获取返回值),这不是一个问题(并且可能会引入意外的问题)getApplicationContext()
在其构造函数中)?
最终答案出现在文档中View http://developer.android.com/reference/android/view/View.html,在“事件处理和线程”标题下:
注意:整个视图树是单线程的。在任何视图上调用任何方法时,您必须始终位于 UI 线程上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)