无法在 AsyncTask for ProgressDialog 中未调用 Looper.ready()的线程内创建处理程序

我不明白为什么会出现这个错误。我正在使用 AsyncTask 在后台运行一些进程。

我有:

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

当我进入 doInBackground()取决于一个条件 I:

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

每当我尝试 downloadSpinnerProgressDialog.show()我收到错误。

你们有什么想法吗?

100254 次浏览

方法 show()必须从 用户界面(UI)线程调用,而 doInBackground()在不同的线程上运行,这是 AsyncTask被设计的主要原因。

您必须在 onProgressUpdate()onPostExecute()中调用 show()

例如:

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

我也有过类似的问题,但通过阅读这个问题,我认为我可以在 UI thread 上运行:

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

Seems to do the trick for me.

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

我也很难做到这一点,对我来说解决办法是同时使用 Hyui 和 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();
}
});
}


}