2010-09-01 3 views
76

nicht aufgerufen hat Ich verstehe nicht, warum ich diesen Fehler erhalte. Ich verwende AsyncTask, um einige Prozesse im Hintergrund auszuführen.Kann Handler innerhalb Thread nicht erstellen, der Looper.prepare() innerhalb AsyncTask für ProgressDialog

ich habe:

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

Wenn ich in doInBackground() abhängig von einer Bedingung erhalten I:

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

Jedes Mal, wenn ich versuche, downloadSpinnerProgressDialog.show() erhalte ich den Fehler.

Irgendwelche Ideen Leute?

Antwort

103

Das Verfahren show() muss von der User-Interface (UI) thread, während doInBackground() läuft auf verschiedenen Thread aufgerufen werden, die der Hauptgrund, warum AsyncTask entworfen wurde.

Sie müssen show() entweder in onProgressUpdate() oder in onPostExecute() anrufen.

Zum Beispiel:

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

, die nicht den Trick für mich, nur versucht, „zu verwenden, war Alertdialog .Builder-Builder = neuer AlertDialog.Builder (Kontext); " und fügte die Konfiguration des Builders hinzu. Der Versuch, dies im onProgressUpdate zu zeigen, führt genau zum selben Fehler. Irgendwelche Ideen ? – ins0m

+0

Danke Konstantin, mir war nicht klar, dass du onProgressUpdate mit einem beliebigen Variablentyp mit publishProgress() überschreiben kannst. Wirklich hat mir geholfen, einfach mit Toast-Nachrichten zu aktualisieren. – wired00

75

Ich hatte ein ähnliches Problem, aber diese Frage aus der Lektüre ich dachte, ich auf UI-Thread laufen konnte:

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

Scheint mir den Trick zu tun.

+0

thanx arbeitete ... – 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

Ich hatte eine harte Zeit zu, diese Arbeit zu machen, für mich die Lösung sowohl hyui und konstantin Antworten,

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

Ich dachte, Sachen, die in 'onProgressUpdate()' erledigt wurden, würden automatisch auf dem UI-Faden laufen –

Verwandte Themen