【发布时间】:2011-09-23 12:37:11
【问题描述】:
这是我的场景:我有一个打开另一个活动的登录屏幕。在活动中我只有:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
布局有点重,因为它是由一些片段组成的,加载大约需要 1.5 秒。
现在,如何在 setContentView 完成填充布局时显示 ProgressDialog?我已经尝试通过将setContentView 放入doInBackground 来使用AsyncTask,但当然不能这样做,因为只能从 UI 线程更新 UI。
所以我需要在 UI 线程中调用setContentView,但是我必须在哪里显示/关闭ProgressDialog?
感谢您的帮助。
Fra.
编辑:我遵循@JohnBoker 之前的建议,这是我现在拥有的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty_layout);
new ContentSetterTask().execute("");
}
private class ContentSetterTask extends AsyncTask<String, Void, Void> {
public ProgressDialog prgDlg;
@Override
protected void onPreExecute() {
android.os.Debug.waitForDebugger();
prgDlg = ProgressDialog.show(MultiPaneActivity.this, "", "Loading...", true);
}
@Override
protected Void doInBackground(String... args) {
android.os.Debug.waitForDebugger();
ViewGroup rootView = (ViewGroup)findViewById(R.id.emptyLayout);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflated = inflater.inflate(R.layout.activity_details, rootView);
return null;
}
@Override
protected void onPostExecute(Void arg) {
android.os.Debug.waitForDebugger();
if (prgDlg.isShowing())
prgDlg.dismiss();
}
}
}
行
View inflated = inflater.inflate(R.layout.activity_details, rootView);
给我错误:
06-27 16:47:24.010:
ERROR/AndroidRuntime(8830): Caused by:android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
【问题讨论】:
-
在 doInBackground 方法中手动充气怎么样?
-
看看你的布局文件会很有趣,我认为最好尝试优化。 1.5秒是在模拟器上还是在手机/平板上?
-
嗨,在 eeePad Transformer 上实际上大约是 1.5 秒。如何手动充气?布局有点长,在这里发布,但它有大约 10-12 个线性布局和一个真正的片段(目前)。
-
activity_empty_layout 上是否有一个布局(相对、线性等),对吗?膨胀activity_details并将null传递给root怎么样,所以,之后,您可以使用父布局中的addView。
-
试过了:View inflated = inflater.inflate(R.layout.activity_details, null); rootView.addView(inflated);我仍然遇到同样的错误。
标签: android multithreading android-activity android-asynctask progressdialog