IllegalArgumentException:View not attached to window manager解決方法

2221 ワード

この問題を投げ出す前に、一般的に次のような異常が投げ出されます.
android.view.WindowLeaked: Activity ... that was originally added here

この問題は、dialogがまだ実行されている間に、dialogを作成するActivityがfinishing操作を行っているためです.
問題が発生した後、どのように問題を再現しますか?方法は以下の通りである:1.携帯電話の「設定-開発者オプション-アクティビティを保持しない」スイッチをオンにします.2.テスト対象のアプリケーションをシャットダウンし、アプリケーションマネージャでアプリケーションを殺す.3.アプリケーションを再起動する.4.進捗ダイアログを表示しているアプリケーションをホームキーを押してバックグラウンドにカットします.
この問題をどのように解決するか:1.onPostExecuteメソッドでActivityの状態を検出し、isDestroyedがtrueであればdialogのdismissメソッドを呼び出さない.2.ActivityのonDestroyメソッドでdialogのdismissメソッドを呼び出します.
この問題を解決する疑似コードは次のとおりです.
public class YourActivity extends Activity {

    <...>

    private void showProgressDialog() {
        if (pDialog == null) {
            pDialog = new ProgressDialog(StartActivity.this);
            pDialog.setMessage("Loading. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
        }
        pDialog.show();
    }

    private void dismissProgressDialog() {
        if (pDialog != null && pDialog.isShowing()) {
            pDialog.dismiss();
        }
    }

    @Override
    protected void onDestroy() {
        dismissProgressDialog();
        super.onDestroy();
    }

    class LoadAllProducts extends AsyncTask {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            showProgressDialog();
        }

        /**
         * getting All products from url
         * */
        protected String doInBackground(String... args)
        {
            doMoreStuff("internet");
            return null;
        }


        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url)
        {
            if (YourActivity.this.isDestroyed()) { // or call isFinishing() if min sdk version < 17
                return;
            }
            dismissProgressDialog();
            something(note);
        }
    }
}

参照stackoverflow View not attached to window manager crashのリンク