【发布时间】:2012-06-26 20:18:21
【问题描述】:
我知道 UI 元素(视图层次结构)只能从 UI 线程进行操作。对于后台操作,可以使用 AsyncTask,它提供事件处理程序以到达 UI 线程。
简而言之,是否允许在非 UI 线程中实例化视图(绑定到 getApplicationContext())?这个自定义视图后代——一旦被实例化——就会从UI 线程 添加到视图层次结构中。所以只有构造函数调用是在 Asynctask.doInBackground() 内完成的;将 (addView(...)) 附加到 Activity 的根布局层次结构仍然在 UI 线程中完成。
详细说明:
public MyView extends View {
public MyView(Context context) {
...
}
...
}
我创建了一个自定义视图,覆盖了
onDraw(...)等。当用户在我的主 Activity 中单击某个 MenuItem 时,会创建另一个 Activity (MyOtherActivity) 并显示哪个屏幕正是 MyView
由于必须立即显示 MyOtherActivity 的屏幕,我在 AsyncTask 中预实例化 MyView,而用户位于主 Activity 的其他位置(即他尚未单击该 MenuItem)。 MyView 引用存储在静态数据成员中。
当
MyOtherActivity.onCreate()被调用时,它的构造器代码从静态中获取MyView,并通过addView(...)将它添加到它的布局根层次结构中。(我知道静态变量可能会导致内存泄漏,所以我在不需要时将其设置为
null。)
MyView 在不同的线程中实例化(并在其构造函数中获取getApplicationContext() 的返回值)不是一个问题(并且可能会引入意想不到的问题)吗?
【问题讨论】:
-
交叉引用
android-developers对此的讨论:groups.google.com/group/android-developers/browse_thread/thread/… -
谢谢,马克。对于所有读者:简而言之,不要做我做过的事。始终从 UI 线程实例化所有视图。我会在 2 天的限制结束后回答我自己的问题。现在我将对其进行编辑。
-
@ThomasCalc 我看不出有什么理由需要等待两天才能得到答复。我认为这是一个很好的问题,值得一个真正的答案(所以我刚刚提供了一个)。
-
@DarshanComputing 当我新注册的时候,有 2 天的限制,但也许它仍然适用。所以你添加一个是个好主意,谢谢。我刚刚将其设置为接受。
标签: java android android-asynctask android-ui android-view