Kann nicht Handler Innengewinde erstellen, die Looper.prepare () innerhalb AsyncTask für ProgressDialog genannt hat nicht
-
26-09-2019 - |
Frage
Ich verstehe nicht, warum ich diesen Fehler. Ich verwende AsyncTask einige Prozesse im Hintergrund laufen zu lassen.
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()
erhalten abhängig von einer Bedingung I:
[...]
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]
Jedes Mal, wenn ich downloadSpinnerProgressDialog.show()
versuchen erhalte ich den Fehler.
Alle Ideen, Jungs?
Lösung
Das Verfahren show()
muss aus dem User Interface (UI) Thread , während doInBackground()
läuft auf verschiedenen Thread aufgerufen werden, die ist der Hauptgrund, warum AsyncTask
entworfen wurde.
Sie haben show()
rufen entweder in onProgressUpdate()
oder in onPostExecute()
.
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();
}
}
Andere Tipps
Ich hatte ein ähnliches Problem, aber diese Frage aus der Lektüre ich dachte, ich auf UI-Thread ausgeführt werden konnte:
YourActivity.this.runOnUiThread(new Runnable() {
public void run() {
alertDialog.show();
}
});
Es scheint für mich, den Trick zu tun.
Ich hatte eine harte Zeit zu, diese Arbeit zu machen, die Lösung war für mich sowohl hyui und konstantin Antworten zu verwenden,
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();
}
});
}
}
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();