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

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

I иметь:

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 () , я получаю сообщение об ошибке.

Любое идеи, ребята?

78
задан mlevit 1 September 2010 в 02:32
поделиться

1 ответ

Метод show() должен вызываться из потока User-Interface (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();
    }
}
105
ответ дан 24 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: