Asynctask内部的解散对话框触发了IllegalArgumentException



我一直在使用对话框来显示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。它比上面的方法更有效,但是,当然,它让我花了更多的精力。

相关内容

  • 没有找到相关文章

最新更新