No se puede crear un controlador dentro del hilo que no ha llamado a Looper.prepare () dentro de AsyncTask para ProgressDialog


78

No entiendo por qué recibo este error. Estoy usando AsyncTask para ejecutar algunos procesos en segundo plano.

Yo tengo:

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...");
}

Cuando entro doInBackground()dependiendo de una condición, yo:

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

Siempre que lo intento downloadSpinnerProgressDialog.show(), recibo el error.

¿Alguna idea chicos?

Respuestas:


106

El método show()debe llamarse desde el hilo de la interfaz de usuario (UI) , mientras que se doInBackground()ejecuta en un hilo diferente, que es la razón principal por la que AsyncTaskse diseñó.

Tienes que llamar show(), ya sea en onProgressUpdate()o en onPostExecute().

Por ejemplo:

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

3
Eso no funcionó para mí, solo probé "AlertDialog.Builder builder = new AlertDialog.Builder (context);" y agregó la configuración del constructor. Intentar mostrar esto dentro de onProgressUpdate conduce exactamente al mismo error. Algunas ideas ?
ins0m

Gracias Konstantin, no me di cuenta de que podía anular onProgressUpdate con cualquier tipo de variable usando publishProgress (). Realmente me ayudó, simplemente actualizar con mensajes tostados.
Wired00

81

Tuve un problema similar, pero al leer esta pregunta pensé que podría ejecutar el hilo de la interfaz de usuario:

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

Parece que me sirve.


getActivity (). runOnUiThread (this :: mymethod); Gracias funcionó muy bien.
mortezahosseini

1

También me costó mucho hacer que esto funcionara, la solución para mí fue usar las respuestas hyui y 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();
       }
     });
 }

}

Pensé que las cosas hechas en onProgressUpdate()se ejecutarían automáticamente en el hilo de la interfaz de usuario
alguien en algún lugar

0
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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.