Не удается создать обработчик внутри потока, который не вызвал 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(), в зависимости от состояния, я:

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

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

Есть идеи, ребята?


person mlevit    schedule 01.09.2010    source источник


Ответы (3)


Метод 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();
    }
}
person Konstantin Burov    schedule 01.09.2010
comment
Это не помогло мне, просто попробовал AlertDialog.Builder builder = new AlertDialog.Builder (context); и добавил конфигурацию построителя. Попытка показать это внутри onProgressUpdate приводит к точно такой же ошибке. Любые идеи ? - person ins0m; 31.08.2011
comment
Спасибо, Константин, я не знал, что вы можете переопределить onProgressUpdate с любым типом переменной, используя publishProgress (). Мне действительно помогло, просто обновить всплывающими сообщениями. - person wired00; 12.12.2012

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

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

Кажется, это помогает мне.

person hyui    schedule 01.09.2011
comment
getActivity (). runOnUiThread (this :: mymethod); Спасибо, сработало очень хорошо. - person mortezahosseini; 07.03.2019

Мне тоже было трудно сделать эту работу, решением для меня было использовать ответы как 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();
       }
     });
 }

}
person caiocpricci2    schedule 16.05.2012
comment
Я думал, что все, что было сделано в onProgressUpdate(), будет автоматически выполняться в потоке пользовательского интерфейса - person Someone Somewhere; 25.11.2013