【发布时间】:2012-05-03 06:19:11
【问题描述】:
我有一个使用 ACRA 的应用已经投入生产了几周,在今天报告了一个奇怪的错误之前,我的错误为零。
我有:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
来自堆栈跟踪中的此方法(已追溯):
at my.app.CountdownFragment$1.void onPostExecute(java.lang.Object)(SourceFile:1)
这是相关的来源sn-p:
private void addInstructionsIfNeeded() {
if (S.sDisplayAssist) {
new AsyncTask<String, Void, String>() {
@Override
protected String doInBackground(String... params) {
return null;
}
/*
* runs on the ui thread
*/
protected void onPostExecute(String result) {
Activity a = getActivity();
if (S.sHelpEnabled && a != null) {
in = new InstructionsView(a.getApplicationContext());
RelativeLayout mv = (RelativeLayout) a
.findViewById(R.id.main_place);
mv.addView(in.prepareView());
}
};
}.execute("");
}
}
addInstructionsIfNeeded() 是从处理程序调度的消息(UI 主题)中调用的。
-
onPostExecute()在 UI 线程上运行,为什么我有“错误的线程”? - 此代码已在 150 多台设备上运行,超过 100000 次(根据 Flurry),从未出现此错误。
- 原始设备是运行 SDK 4.0.4 的三星 SGH-I997
我的问题是:怎么可能?
编辑: 这一切都发生在一个片段中
【问题讨论】:
-
问题出在
Activity a = getActivity();行中,您应该在进入 AsyncTask 之前执行此操作。您应该使用类构造函数进行此类初始化 -
如果我在成员变量中保留对活动的引用,在某些情况下,它不会使过时的活动对象保持活动状态,从而导致内存泄漏吗? (直到内部类实例死亡)
标签: android