我在doInBackground 方法progressdialog
中使用AsyncTask打开一个问题正在从数据库加载,问题成功加载后,进度对话框将关闭
但我的问题是有一段时间我收到以下错误
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44757528 is not valid; is your activity running?
通过进行一些谷歌搜索,我发现我可能正在保留对已被破坏的上下文的引用(明确地,或通过创建对话框或吐司或其他一些依赖项)(通常是因为您正在使用 onCreateDialog或者您将 Activity 传递给在 Activity 被销毁时没有被销毁的其他进程)。
因此,如果活动在对话框被关闭之前被破坏,我在下面放置了关闭progressdialog的代码
protected void onDestroy() {
if (pdForNewQuestion != null)
pdForNewQuestion.dismiss();
super.onDestroy();
}
但我仍然面临这个问题。我没有破坏任何活动,但有时会突然出现错误,有时会正常工作
异步代码如下
// 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();
}