web-dev-qa-db-fra.com

Impossible de créer un gestionnaire dans un thread qui n'a pas appelé Looper.prepare () dans AsyncTask for ProgressDialog

Je ne comprends pas pourquoi je reçois cette erreur. J'utilise AsyncTask pour exécuter certains processus en arrière-plan.

J'ai:

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

Quand j'entre dans doInBackground() selon une condition, je:

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

Chaque fois que j'essaie downloadSpinnerProgressDialog.show() je reçois l'erreur.

Des idées les gars?

78
mlevit

La méthode show() doit être appelée à partir du thread interface utilisateur , tandis que doInBackground() s'exécute sur un autre thread, ce qui est la raison principale pour laquelle AsyncTask a été conçu.

Vous devez appeler show() soit dans onProgressUpdate(), soit dans onPostExecute().

Par exemple:

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
Konstantin Burov

J'ai eu un problème similaire, mais en lisant cette question, j'ai pensé que je pourrais exécuter le fil de l'interface utilisateur:

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

Semble faire le tour pour moi.

81
hyui

J'ai eu du mal à faire ce travail aussi, la solution pour moi était d'utiliser à la fois les réponses hyui et 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();
       }
     });
 }

}
1
caiocpricci2
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();
0
jayesh kavathiya