2016-12-26 33 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(); 
} 

我固定它現在只是每次我用它的時間來創建對話框的新實例。

問題是如果我的修復方法沒問題,或者有更好的方法來處理這種情況?

回答

1

我需要多一點上下文來調用setAlertDialog以顯示對話框。由於活動正在被銷燬,聽起來像對話框可能是從異步任務中顯示的。

此外,將對話框保持爲實例變量的理由是什麼?通常這樣做是爲了在暫停或銷燬Activity時清除對話框。

TlDr;你的修復聽起來很好。

加長版(做一些假設):

在我的經驗,你通常要負責創建並顯示在同一時間的對話框。如果你不想創建對話框多次(和你不破壞Activity創建對話框並顯示它之間的計劃)類似於下面的東西應該工作:

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

然後加入以下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(); 
}