我一直在使用对话框来显示Asynctask
的进度。通过这样做,我在onPreExecute
中初始化它,并在onPostExecute
中解除它。我不确定是什么出了问题,当我放置一个条件解散只有如果它不是空的,它显示,但仍然触发IllegalArgumentException: View not attached to window manager
代码如下:
public class SampleTask extends AsyncTask<String, Void, String> { public ProgressDialog pDialog; @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(SampleActivity.this); pDialog.setMessage(getString(R.string.loading)); pDialog.setCancelable(false); pDialog.show(); } @Override protected String doInBackground(String... path) { . . . } @Override protected void onPostExecute(String result) { super.onPostExecute(null); if (null != pDialog && pDialog.isShowing()) { pDialog.dismiss(); } . . . } }
我在这里读到类似的解决方案,但如果我把null != pDialog && pDialog.isShowing()
放在一起在相同的条件下会有所不同吗?
你的问题是你只接受android视图在主UI线程。当你在onPostExecute(String)
中调用pDialog.dismiss();
时,它会在另一个线程上运行,所以android会抛出新的IllegalArgumentException
。我有一些解决方案,希望对你有所帮助:
1. 我一直用这个方法,但它一点也不好。
Handler handler = new Handler();
Runnable runable = new Runnable() {
@Override
public void run() {
// TODO something you would like to do with Android UI.
}
};
handler.post(runable);
Handler将创建一个新的线程在UI线程上运行,这样你就可以使用Android UI。
2. 有时我尝试使用interface
。它比上面的方法更有效,但是,当然,它让我花了更多的精力。