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

mle*_*vit 78 java android runtime-error progressdialog looper

我不明白为什么我会收到这个错误.我正在使用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...");
}
Run Code Online (Sandbox Code Playgroud)

当我doInBackground()根据条件进入时我:

[...]    
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

Kon*_*rov 105

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说没有办法,只是试过"AlertDialog.Builder builder = new AlertDialog.Builder(context);" 并添加了构建器的配置.试图在onProgressUpdate中显示这个导致完全相同的错误.有任何想法吗 ? (3认同)

小智 81

我有一个类似的问题,但从阅读这个问题,我想我可以在UI线程上运行:

YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        alertDialog.show();
    }
});
Run Code Online (Sandbox Code Playgroud)

似乎为我做了伎俩.