不能在AsyncTask中为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()
取决于条件I:
[...] connectionProgressDialog.dismiss(); downloadSpinnerProgressDialog.show(); [...]
每当我尝试downloadSpinnerProgressDialog.show()
我收到错误。
任何想法家伙?
show()
方法必须从用户界面(UI)线程 doInBackground()
,而doInBackground()
运行在不同线程上,这是deviseAsyncTask
主要原因。
您必须在onProgressUpdate()
或onPostExecute()
调用show()
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(); } }
我有一个类似的问题,但从阅读这个问题,我想我可以在UI线程上运行:
YourActivity.this.runOnUiThread(new Runnable() { public void run() { alertDialog.show(); } });
似乎为我做了诡计。
我也很难做这个工作,对我来说解决scheme是使用hyui和konstantin的答案,
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(); } }); } }
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();