我知道UI元素(视图层次结构)只能从UI线程中操作。对于后台操作,可以使用AsyncTask,它提供了事件处理程序以访问UI线程。
简而言之,是否允许在非UI线程中实例化与“getApplicationContext()”相关联的View?此自定义View后代 - 一旦实例化 - 将添加到从UI线程调用的视图层次结构中。因此,仅在“Asynctask.doInBackground()”中完成构造函数调用; 它的附加(“addView(...)”)操作仍在UI线程中完成,因为它是添加到Activity的根布局层次结构中。
详细情况如下:
简而言之,是否允许在非UI线程中实例化与“getApplicationContext()”相关联的View?此自定义View后代 - 一旦实例化 - 将添加到从UI线程调用的视图层次结构中。因此,仅在“Asynctask.doInBackground()”中完成构造函数调用; 它的附加(“addView(...)”)操作仍在UI线程中完成,因为它是添加到Activity的根布局层次结构中。
详细情况如下:
public MyView extends View {
public MyView(Context context) {
...
}
...
}
我创建了一个自定义视图,重写了
onDraw(...)
等方法。当用户在我的主活动中点击某个特定菜单项时,会创建并显示另一个名为MyOtherActivity的活动,“其屏幕正是MyView”。
由于MyOtherActivity的屏幕必须立即显示,因此我在用户在主活动的其他位置(例如,他还没有点击该菜单项)时使用AsyncTask预先实例化了MyView。 MyView引用存储在静态数据成员中。
当调用
MyOtherActivity.onCreate()
时,它的构造函数代码从静态变量中取出MyView,并通过addView(...)
将其添加到其布局根层次结构中。(我知道静态变量可能会引入内存泄漏,所以一旦不再需要,就将其设置为
null
。)
MyView在不同的线程中被实例化(并在其构造函数中获取getApplicationContext()
的返回值),这是否是一个问题(并可能导致意外问题)?
android-developers
讨论:https://groups.google.com/group/android-developers/browse_thread/thread/7be473d2a332d0af - CommonsWare