首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在尚未在ProgressDialog的AsyncTask内调用Looper.prepare()的线程内创建处理程序

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

Stack Overflow用户
提问于 2010-09-01 10:32:30
回答 4查看 100.2K关注 0票数 78

我不明白为什么我会得到这个错误。我正在使用AsyncTask在后台运行一些进程。

我有:

代码语言:javascript
复制
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()时,取决于以下条件:

代码语言:javascript
复制
[...]    
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]

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

有什么想法吗,伙计们?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-01 11:16:46

方法show()必须从User-Interface (UI) thread调用,而doInBackground()运行在不同的线程上,这是设计AsyncTask的主要原因。

您必须在onProgressUpdate()onPostExecute()中调用show()

例如:

代码语言:javascript
复制
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();
    }
}
票数 106
EN

Stack Overflow用户

发布于 2011-09-01 20:05:58

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

代码语言:javascript
复制
YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        alertDialog.show();
    }
});

似乎对我很管用。

票数 81
EN

Stack Overflow用户

发布于 2012-05-16 18:08:03

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

代码语言:javascript
复制
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();
       }
     });
 }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3614663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档