Java Can';t在未调用Loop.prepare()的线程内为ProgressDialog创建AsyncTask内的处理程序

Java Can';t在未调用Loop.prepare()的线程内为ProgressDialog创建AsyncTask内的处理程序,java,android,runtime-error,progressdialog,looper,Java,Android,Runtime Error,Progressdialog,Looper,我不明白为什么我会犯这个错误。我正在使用AsyncTask在后台运行一些进程 我有: protected void onPreExecute() { connectionProgressDialog = new ProgressDialog(SetPreference.this); connectionProgressDialog.setCancelable(true); connectionProgressDialog.setProgressStyle(Progres

我不明白为什么我会犯这个错误。我正在使用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();
[...]
每当我尝试下载SpinnerProgressDialog.show()时,我都会收到错误

有什么想法吗?

方法
show()
必须从调用,而
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();
    }
}
class ExampleTask扩展了AsyncTask{
//您的onPreExecute方法。
@凌驾
受保护的字符串doInBackground(字符串…参数){
//你的密码。
如果(条件为真){
这个.publishProgress(“显示对话框”);
}
返回“结果”;
}
@凌驾
受保护的void onProgressUpdate(字符串…值){
super.onProgressUpdate(值);
connectionProgressDialog.Disclose();
下载SpinnerProgressDialog.show();
}
}

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

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

似乎对我很有帮助。

我也很难做到这一点,我的解决方案是使用hyui和konstantin的答案

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

}
class ExampleTask扩展了AsyncTask{
//您的onPreExecute方法。
@凌驾
受保护的字符串doInBackground(字符串…参数){
//你的密码。
如果(条件为真){
这个.publishProgress(“显示对话框”);
}
返回“结果”;
}
@凌驾
受保护的void onProgressUpdate(字符串…值){
super.onProgressUpdate(值);
YourActivity.this.rununuithread(new Runnable()){
公开募捐{
alertDialog.show();
}
});
}
}

这对我来说并不管用,只是尝试了“AlertDialog.Builder=new AlertDialog.Builder(上下文);”并添加了生成器的配置。试图在onProgressUpdate中显示这一点会导致完全相同的错误。有什么想法吗?谢谢Konstantin,我不知道你可以使用publishProgress()用任何变量类型覆盖onProgressUpdate。真的帮助了我,简单地用toast消息进行更新。我以为在
onProgressUpdate()
中完成的工作会自动在UI threadgetActivity()上运行;谢谢,效果很好。