这是我的情境:我有一个登录屏幕,它会打开另一个活动。在该活动中,我只有以下代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
布局有点沉重,因为它由一些片段组成,需要约1.5秒来加载。现在,我怎样才能在setContentView
完成膨胀布局时显示一个ProgressDialog
呢?我已经尝试使用AsyncTask
通过将setContentView
放在doInBackground
中,但是这显然行不通,因为只能从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.
View inflated = inflater.inflate(R.layout.activity_details, null);
然后将该视图返回到你的onPostExecute
中,在那里你可以将它添加到你的根视图中。 - John Bokerinflated = inflater.inflate(R.layout.activity_details, null);
,而在onPostExecute中则是:rootView.addView(inflated);
。然而,addView会影响到我的activity_details中的weightSum和layout weights。setContentView的效果与之相同,但没有这些问题。问题在于ProgressDialog被冻结了:它会在加载之前出现,然后自己冻结,一旦布局被填充就消失了。这是因为填充操作是在创建/销毁ProgressDialog的同一个线程上执行的。那么,我该如何使ProgressDialog保持响应呢? - frapontillo