Android: “BadTokenException: kann Nicht hinzufügen-Fenster; ist Ihre Tätigkeit ausführen?
Ich bin die Eröffnung eines progressdialog
mit AsyncTask in doInBackground-Methode die Frage, ist das laden aus der Datenbank und nach der Frage erfolgreich geladen der Fortschritt Dialogfeld wird geschlossen
aber mein problem ist, dass einige Zeit ich bekomme folgenden Fehler
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44757528 is not valid; is your activity running?
indem Sie einige googeln habe ich gefunden, dass es möglicherweise ich halte einen Verweis auf einen Kontext (entweder explizit, oder indem Sie einen Dialog oder ein Toast oder eine andere abhängige Element), das zerstört wurde (in der Regel, weil Sie die onCreateDialog oder Sie übergeben die Aktivität zu einigen anderen Verfahren, die nicht zerstört erhalten, wenn die Aktivität zerstört wurde).
So, ich habe folgenden code, der entlassen progressdialog in-Fall, wenn die Aktivität zerstört wird, bevor das Dialogfeld geschlossen wird
protected void onDestroy() {
if (pdForNewQuestion != null)
pdForNewQuestion.dismiss();
super.onDestroy();
}
aber ich immer noch vor der Frage. Ich bin nicht die Zerstörung jeglicher Aktivität, aber immer noch der Fehler plötzlich kommt manchmal und manchmal klappt es richtig
den asynchronen code unten
//Start new question in every 60 seconds :)
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
mProgressStatus++;
} catch (Exception e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
txtCountingNum.setText((timer--) + "\nSec.");
if (timer < 0) {
questionLoadWithAsyncTask();
}
}
});
}
}
}).start();
public void questionLoadWithAsyncTask() {
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
pdForNewQuestion = new ProgressDialog(QuizActivity.this);
pdForNewQuestion.setTitle("Please wait...");
pdForNewQuestion.setMessage("Question is loading...");
pdForNewQuestion.setCancelable(false);
pdForNewQuestion.setIndeterminate(true);
pdForNewQuestion.show();
}
@Override
protected Void doInBackground(Void... arg0) {
wordsCursor = dbHelper.getRandomWords();
return null;
}
@Override
protected void onPostExecute(Void result) {
if (pdForNewQuestion != null) {
pdForNewQuestion.dismiss();
}
}
}.execute();
}
- Veröffentlichen Sie Ihren code für asynchrone Aufgabe, ich vermute, Sie haben nicht entlassen Ihr Fortschritts-dialog.
- Bitte posten Sie Ihre
asynctask
code - Bekommst du Fehler beim drehen mobile oder in der Regel immer Fehler?
- Nein, nicht an der Zeit Drehen, aber Fehler entstehen automatisch während der Ausführung meiner Tätigkeit, es kann einige Zeit oder zu unterschiedlichen Zeiten 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prüfen Sie, ob der dialog zeigt oder nicht, wenn das Dialogfenster zeigt dann nur entlassen wie diese..
ausgeführt werden unendliche Schleife in neuen Thread, aber nicht brechen die Schleife und beenden diesen Thread. Es läuft unendlich im hintergrund, auch wenn die Aktivität geht im hintergrund. versuchen Sie beenden den Thread, sobald die Arbeit beendet ist.
Erste von allen, warum sind Sie beginnen, Ihre
AsyncTask
innerhalb einerThread
? Wie ich verstehe, dass Sie versuchen, starten Sie eineAsyncTask
alle 60 Sekunden, und füllen Sie eine neue Frage. Es ist ein viel besserer Weg, dies zu tun mit nur einHandler
undAsyncTask
.Erstellen Sie eine
Handler
- und post -Runnable
verkehrt Sekunden und je nach Ergebnis beginnen Sie IhrenAsyncTask
:und Sie können Ihre
AsyncTask
wie diese :Dies ist in der Regel verursacht durch Ihre app versucht, einen dialog anzeigen, der mithilfe einer zuvor beendeten Tätigkeit als Kontext. Überprüfen Sie dann, dass die Aktivität ist nicht geschlossen, die von einigen anderen apps oder andere Auslöser, bevor das Dialogfeld angezeigt