在Asynctask中解除对话框会触发IllegalArgumentException

时间:2014-06-04 03:52:48

标签: android android-asynctask android-dialog 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();
            }
            .
            .
            .
        }
    }

我看了here类似的解决方案,但如果我将null != pDialog && pDialog.isShowing()置于同一条件下会有所不同吗?

1 个答案:

答案 0 :(得分:0)

你的问题是你只接受主UI线程中的android视图。 Read this link for more detail因此,当您在pDialog.dismiss();中调用onPostExecute(String)时,它会在另一个线程上运行,因此android会抛出新的IllegalArgumentException。我有一些解决方案,希望得到帮助:
我总是使用这个解决方案,但它根本不好:

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 Thread上运行的新线程,以便您可以使用Android UI 2.有时我尝试使用interface。它比上面的解决方案更有效,当然,它让我花更多的精力。