2016-11-24 44 views
0

この質問には解決策がいくつもあるとわかっていますが、どれも私のために働いていません。すべてのチェックを済ませても、ダイアログを閉じるとアプリケーションがクラッシュします。ここでダイアログが終了するとアプリケーションがクラッシュする

は、私が使用していますコードです:

public void dismissDialog(int dialogId) { 
    Dialog dialog = getDialog(dialogId); 
    Activity activity = mActivity.get(); 
    if (activity != null && !activity.isFinishing()) { 
     if (dialog != null) { 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
      mDialogsMap.remove(dialogId); 
     } 
    } 
} 

私はこの方法を使用して、すべてのダイアログを却下していますが、それでもユーザーがこれらのクラッシュを取得しています。

ログを参照してください:

Fatal Exception: java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{144f7eb V.E...... R......D 0,0-684,240} not attached to window manager 
     at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:424) 
     at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:350) 
     at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:118) 
     at android.app.Dialog.dismissDialog(Dialog.java:362) 
     at android.app.Dialog.dismiss(Dialog.java:345) 
     at com.syntonic.freeway.android.DialogController.dismissDialog(SourceFile:64) 
     at com.syntonic.freeway.android.ui.OffersAndRewardDetailActivity$4.onSuccess(SourceFile:770) 
     at com.gs.jutil.web.NetworkCallback.onProgress(SourceFile:64) 
     at com.gs.jutil.web.NetworkCallback.validate(SourceFile:7) 
     at com.gs.jutil.web.NetworkCallback$1.run(SourceFile:46) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5451) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+1

あなたのコードでは 'dismissDialog()'を呼び出していますが、どの行がこのエラーを投げていますか? –

答えて

0

ビューが破棄された後に、そのダイアログが閉じられているので、それはある...この

if (view.isShown()) { 
dialog.dismiss() 
} 
0

あなたの問題はあなたがクローズしようとしているということです試してみてください添付されていないダイアログ。

java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{144f7eb V.E...... R......D 0,0-684,240} not attached to window manager 

dialogIdを渡す代わりに、ダイアログオブジェクトを渡す必要があります。開いているハッシュマップやダイアログのリストを保存しておいて、それらを繰り返し閉じようとしていますか?あなたは正確に何を達成しようとしていますか?ダイアログを通過させる場合は、少なくともそれらが接続されていることを保証するか、少なくともそれらがまだ接続されていることを確認することができます。ここで

は、フィードバックに基づいて断片 https://github.com/jmitchell38488/android-todo-app/blob/master/app/src/main/java/com/github/jmitchell38488/todo/app/ui/activity/ListActivity.java

List<DialogFragment> dialogs = new ArrayList<>(); 
dialogs.add(myNewDialog); 
@Override 
public void onDialogPositiveClick(DialogFragment dialog) { 
    if (some_code_that_does_not_dismiss) { 
     dialog.remove(dialog); 
     ... 
    } else { 
     dialog.dismiss(); 
    } 
} 

編集内部私が管理しているどのようにクリックの例です: あなたは私が間違っていると思うの弱い参照(保存している場合 - 、どれだけ多くのダイアログをすることができますあなたはいつでも開いているかメモリに保存していますか?)、それらを管理するにはDialogManagerを使用する必要があります。をインスタンス化する必要があります。その上にDialogFragmentを拡張する抽象クラスが必要ですあなたの却下と管理ロジックを一元化します。こうすることですべてを行う必要がある。そして、

DialogFactory.getInstance(/** args **/) 

onStopまたはonDestroy内側:

// If you want to store them in the bundle 
SerializedDialogManager = DialogManager.serialize(); 

// Else, delete them 
DialogManager.shutdown(); 

あなたのシャットダウンの中で、あなたはそれがまだ存在するかどうかを確認するために、各ダイアログボックスをチェックし、却下することができます。

List<Integer> dialogIds = new ArrayList<>(); 
for (int id ; dialogIds) { 
    Dialog d = getDialog(id); 
    if (d != null && d.isShown()) { 
     d.dismiss(); 
    } 
} 

本当に、あなたはダイアログ内の却下アクションを処理する必要があります。

思考のための食べ物ですが、私は個人的に弱い参照であまり気にしてはならず、アクティビティ/ダイアログでインスタンス化を処理してシャットダウンするべきだと思います。

+0

実際には、アプリケーションのすべてのダイアログを単一の場所から処理しているため、ダイアログの弱い参照を維持しています。特定のコールバックの応答でdismissDialogを呼び出すと、それらは非同期呼び出しであるため、時にはクラッシュすることがあります。 –

+0

あなたの貴重な時間と提案のためにジャスティンに感謝しかし、アプリケーションは非常に複雑で非常に安定した状態であり、多くの努力を要したため、私の現在のコードには多くの変更が必要です); 100以上のダイアログがあるので、 。だから私の現在の方法をあなたが示唆することができる任意の変更を見て? –

+0

現在のコードにヌルチェックを追加し、 'if(dialog!= null && dialog.isShown()){dialog.dismiss();が表示されるかどうかをチェックするだけです。 } ' –

関連する問題