2010-12-22 107 views
6

我有一個活動,在後臺顯示進度對話框時從互聯網獲取一些數據。當我得到數據(或錯誤)時,我忽略該對話框並顯示另一個對話框。Activity.showDialog當活動可能不在前臺

如果由於某些原因網站花費太長時間來提供響應(例如15秒以上),手機將關閉屏幕。現在,當屏幕關閉時,如果我得到響應並嘗試顯示對話框,將會出現錯誤(WindowManager $ BadTokenException:無法添加窗口 - 令牌[email protected]無效;是您的活動運行?)

這個問題的原因很簡單:當屏幕關閉時,另一個活動來到前臺(keyguard或其他)。

問:現在,什麼對我們知道可能沒有運行活動調用的ShowDialog最好的方法是什麼? (活動已創建,但不是用戶正在與之交互的那個人......換句話說,它處於停止狀態)。

我相信如果我點擊home並更改爲Home活動,也會發生類似的行爲。 (雖然我不能在我的特殊情況下做到這一點,因爲我的活動會取消請求,一切都會正確關閉)。

我不認爲這有什麼差別,但是在我的Android轉載此2.1

+0

可能希望在`onPause,onResume,onDestroy,onStop`方法中放置一些代碼。這樣,如果在線程完成之前調用「onPause」(或任何可能的內容),並且在完成之前不調用「onResume」,則會知道啓動線程的活動的狀態 - 並知道是否你可以顯示一個對話框 – binnyb 2010-12-22 21:18:59

+0

但我想顯示對話框。如果活動沒有被用戶看到,當他回到我的活動時,我希望它顯示對話框... – 2010-12-22 21:33:42

回答

10

捕獲了異常,並使用某種形式的持久性存儲來保存一個標誌,表明你正在等待顯示一個對話框。然後在onResume()檢查該標誌,如果它的真實顯示適當的對話框。像這樣的事情也許:

try { 
    getYourDataFromWeb(); 
    showDialog() 
} catch (BadTokenException e) { 
    myPrefsEditor.putBoolean("FailedToShowDialog", true); 
    myPrefsEditor.commit(); 
    e.printStackTrace(); 
} 

然後在你的onResume()方法是這樣的:

if(myPrefs.getBoolean("FailedToShowDialog", false) == true){ 
    showDialog(); 
    myPrefsEditor.putBoolean("FailedToShowDialog", false); 
    myPrefsEditor.commit(); 
} 
1

我用下面的代碼來判斷我的命運活動是否是在前臺。如果沒有,請不要彈出對話框。

ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE); 
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 
if(cn.getClassName().equals("com.xxx.xxx.xxxx") { 
    showDialog(); 
} 
相關問題