Can't create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog
The method show()
must be called from the User-Interface (UI) thread, while doInBackground()
runs on different thread which is the main reason why AsyncTask
was designed.
You have to call show()
either in onProgressUpdate()
or in onPostExecute()
.
For example:
class ExampleTask extends AsyncTask<String, String, String> { // Your onPreExecute method. @Override protected String doInBackground(String... params) { // Your code. if (condition_is_true) { this.publishProgress("Show the dialog"); } return "Result"; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); connectionProgressDialog.dismiss(); downloadSpinnerProgressDialog.show(); }}
I had a similar issue but from reading this question I figured I could run on UI thread:
YourActivity.this.runOnUiThread(new Runnable() { public void run() { alertDialog.show(); }});
Seems to do the trick for me.
I had a hard time making this work too, the solution for me was to use both hyui and konstantin answers,
class ExampleTask extends AsyncTask<String, String, String> {// Your onPreExecute method.@Overrideprotected String doInBackground(String... params) { // Your code. if (condition_is_true) { this.publishProgress("Show the dialog"); } return "Result";}@Overrideprotected void onProgressUpdate(String... values) { super.onProgressUpdate(values); YourActivity.this.runOnUiThread(new Runnable() { public void run() { alertDialog.show(); } }); }}