Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () внутри AsyncTask для ProgressDialog

Я не понимаю, почему я получаю эту ошибку. Я использую AsyncTask для запуска некоторых процессов в фоновом режиме.

У меня есть:

protected void onPreExecute() { connectionProgressDialog = new ProgressDialog(SetPreference.this); connectionProgressDialog.setCancelable(true); connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); connectionProgressDialog.setMessage("Connecting to site..."); connectionProgressDialog.show(); downloadSpinnerProgressDialog = new ProgressDialog(SetPreference.this); downloadSpinnerProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); downloadSpinnerProgressDialog.setMessage("Downloading wallpaper..."); } 

Когда я попадаю в doInBackground() зависимости от условия I:

 [...] connectionProgressDialog.dismiss(); downloadSpinnerProgressDialog.show(); [...] 

Всякий раз, когда я пытаюсь downloadSpinnerProgressDialog.show() я получаю сообщение об ошибке.

Любые идеи парней?

Метод show() должен вызываться из потока пользовательского интерфейса (UI) , тогда как doInBackground() работает в другом потоке, что является основной причиной, по которой был разработан AsyncTask .

Вы должны вызвать show() либо в onProgressUpdate() либо в onPostExecute() .

Например:

 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(); } } 

У меня была аналогичная проблема, но, прочитав этот вопрос, я решил, что могу работать в потоке пользовательского интерфейса:

 YourActivity.this.runOnUiThread(new Runnable() { public void run() { alertDialog.show(); } }); 

Кажется, это трюк для меня.

Мне тоже пришлось делать эту работу, решение для меня состояло в том, чтобы использовать как hyui, так и konstantin ответы,

 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); YourActivity.this.runOnUiThread(new Runnable() { public void run() { alertDialog.show(); } }); } } 
 final Handler handler = new Handler() { @Override public void handleMessage(final Message msgs) { //write your code hear which give error } } new Thread(new Runnable() { @Override public void run() { handler.sendEmptyMessage(1); //this will call handleMessage function and hendal all error } }).start(); 
Intereting Posts