一尘不染

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

java

我不明白为什么会收到此错误。我正在使用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()我都会收到错误消息。

有想法吗?


阅读 248

收藏
2020-03-24

共1个答案

一尘不染

该方法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();
    }
}
2020-03-24