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


78

我不明白为什么会收到此错误。我正在使用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()根据情况进入时:

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

每当我尝试时downloadSpinnerProgressDialog.show(),都会收到错误消息。

有想法吗?

Answers:


106

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

你必须调用show()无论是在onProgressUpdate()onPostExecute()

例如:

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

3
那对我没有帮助,只是尝试了“ AlertDialog.Builder builder = new AlertDialog.Builder(context);” 并添加了构建器的配置。试图在onProgressUpdate内部显示此错误会导致完全相同的错误。有任何想法吗 ?
ins0m 2011年

感谢Konstantin,我没有意识到您可以使用publishProgress()使用任何变量类型覆盖onProgressUpdate。确实对我有所帮助,只需更新吐司消息即可。
有线00年

81

我有一个类似的问题,但是通过阅读这个问题,我发现我可以在UI线程上运行:

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

似乎可以帮我。


getActivity()。runOnUiThread(this :: mymethod); 谢谢工作很好。
mortezahosseini

1

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

}

我以为完成的工作onProgressUpdate()会自动在UI线程上运行
某处某人

0
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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.