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

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

伙计们,有什么想法吗?


答案 1

该方法必须从用户界面(UI)线程调用,同时在不同的线程上运行,这是设计的主要原因。show()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();
    }
}

答案 2

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

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

似乎为我做了伎俩。


推荐