2016-12-26 6 views
0

私は、ダイアログの作成とアプリケーションでの表示を処理するクラスを持っています。Handlind Androidダイアログはコンテキストが破壊される

それはクラスのメンバと次の行を有する方法としてダイアログを得た:

public static void setAlertDialog(String title, final Context con, boolean dialogCancelable) 
{ 
    if(myDialog == null) 
    { 
     myDialog = new Dialog(con); 
    ... 
} 

コンテキストは(そのことはまれではないことを意味するアプリケーションの作用により)いくつかの時間後に破壊することができます

トークンを追加できません - トークン[email protected]が無効です。あなたの活動は実行されていますか?ダイアログが同じインスタンスをままなので

、以下を実行することを示唆している修正は動作しません。

if(!((Activity)con).isFinishing()) 
{ 
     myDialog.show(); 
} 

を私は単に私がそれを使用するたびにダイアログの新しいインスタンスを作成すると、今のためにそれを固定しました。

問題は私の修正がOKか、この状況を処理するためのより良い方法があるかどうかです。

答えて

1

ダイアログを表示するのと併せて、setAlertDialogがどのように呼び出されているか少し詳しくお尋ねします。アクティビティが破棄されているので、非同期タスクからダイアログが表示されているようです。

さらに、ダイアログをインスタンス変数として保持する理由は何ですか?通常これは、Activityを一時停止または破棄するときにダイアログをクリーンアップできるように行われます。

TlDr;あなたの修正はうまく聞こえる。

ロングバージョン(いくつかの仮定を作る):私の経験で

は、あなたが一般的に作成し、同時にダイアログを示す処理したいです。に以下を追加する次に

if(!((Activity) context).isFinishing()){ 
    if (myDialog == null) { 
    myDialog = new Dialog(context); 
    } 
    myDialog.show(); 
} 

:あなたは、ダイアログを複数回(とダイアログを作成し、それを示すの間Activityを破壊する予定がない)、次のようなものが動作するはずを作成したくない場合Activityを入力して、ダイアログボックスがクリーンアップされていることを確認します。

@Override 
protected void onDestroy() { 
    // Dismiss any dialogs to avoid leaking windows. 
    if (myDialog != null && myDialog.isShowing()) { 
    myDialog.dismiss(); 
    // This is optional, but would keep you from having the context 
    // issue if you are still having it and don't mind re-creating 
    // the dialog each time. 
    myDialog = null; 
    } 

    super.onDestroy(); 
} 
関連する問題