2010-09-01 103 views
76

我不明白为什么我得到这个错误。我使用AsyncTask在后台运行一些进程。无法在线程内创建处理程序内部没有在AsyncTask中调用Looper.prepare()ProgressDialog

我:

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()我收到错误。

任何想法家伙?

回答

103

方法show()必须从User-Interface (UI) thread调用,而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-08-30 21:28:18

+0

感谢Konstantin,我没有意识到你可以用任何使用publishProgress()的变量类型覆盖onProgressUpdate。真的帮助我,只需更新吐司消息。 – wired00 2012-12-12 03:07:46

75

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

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

似乎做的伎俩我。

+0

thanx工作... – Debasish 2017-12-23 13:26:04

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

我有一个很难使这项工作过,对我来说,解决方案是使用两个hyui和康斯坦丁答案,

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

} 
+0

我认为在'onProgressUpdate()'中完成的东西会自动在UI线程上运行 – 2013-11-25 19:21:37

相关问题