2010-09-01 4 views
76

Je ne comprends pas pourquoi j'obtiens cette erreur. J'utilise AsyncTask pour exécuter certains processus en arrière-plan.Impossible de créer le gestionnaire à l'intérieur du thread qui n'a pas appelé Looper.prepare() dans AsyncTask pour ProgressDialog

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 je rentre dans doInBackground() selon une condition I:

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

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

Des idées les gars?

Répondre

103

La méthode show() doit être appelée à partir du User-Interface (UI) thread, tandis que doInBackground() fonctionne sur différents fils qui est la principale raison pour laquelle AsyncTask a été conçu.

Vous devez appeler show() soit au onProgressUpdate() soit au 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(); 
    } 
} 
+3

Cela n'a pas fait l'affaire pour moi, juste essayé « AlertDialog .Builder builder = nouveau AlertDialog.Builder (contexte); " et ajouté la configuration du constructeur. Essayer de montrer ceci dans le onProgressUpdate conduit exactement à la même erreur. Des idées ? – ins0m

+0

Merci Konstantin, je ne savais pas que vous pouviez remplacer onProgressUpdate avec n'importe quel type de variable en utilisant publishProgress(). Vraiment m'a aidé, simplement mettre à jour avec des messages toast. – wired00

75

J'ai eu un problème similaire, mais à la lecture de cette question que je pensais que je pouvais courir sur thread d'interface utilisateur:

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

semble faire l'affaire pour moi.

+0

thanx travaillé ... – Debasish

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

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

} 
+0

Je pensais que les choses faites dans 'onProgressUpdate()' allaient automatiquement s'exécuter sur le thread de l'interface utilisateur –

Questions connexes