this is my scenario: I've got a login screen that opens another activity. In the Activity I simply have:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
The layout is kind of heavy, cause it is made of some fragments, and takes about 1.5 seconds to load.
Now, how can I display a ProgressDialog
while setContentView
finishes inflating the layout? I've tried with AsyncTask
by putting the setContentView
in the doInBackground
, but of course that cannot be done, as the UI can be updated from the UI thread only.
So I need to call setContentView
in the UI thread, but where do I have to show/dismiss the ProgressDialog
?
I appreciate your help.
Fra.
EDIT: I followed @JohnBoker's previous suggestion, this is the code I have now:
@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();
}
}
}
The row
View inflated = inflater.inflate(R.layout.activity_details, rootView);
gives me the error:
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);
then return that view to your onPostExecute where you can add it to your rootView ? – Cookieinflated = inflater.inflate(R.layout.activity_details, null);
and in onPostExecute:rootView.addView(inflated);
addView, however, messes with the weightSum and the layout weights in my activity_details. setContentView works just the same but has no issues. The problem is the same, ProgressDialog is frozen: it appears before the loading, freezes itself and disappears once the layout has been inflated. This is because the inflation is done on the same thread as the one in which the ProgressDialog is created/destroyed. How can I make the ProgressDialog responsive? – Goggle