2011-08-01 175 views
0

我通過擴展應用程序在我的應用程序中定義了一些全局變量,如下所示。當我離開應用程序時,打開更多應用程序並與他們玩一下,然後回到我的應用程序,全局變量已被刪除,我的應用程序崩潰。我有兩個問題:全局變量問題

1-這怎麼可能?

2-如何強制我的應用在退出背景時退出?我知道我不應該這樣做,但我不能找到其他的解決辦法...

感謝

public class GlobalVars extends Application { 

    public static HashMap<Integer, String> ID2Cat = new HashMap<Integer, String>(); 

    // User logged bool 
    public static boolean isLogged = false; 

    // Current menu item 
    public static int currentMenuItem = 0; 
    public static boolean isHome = false; 

    // Goodideas  
    public static JSONObject goodIdeas = new JSONObject(); 

    // Meteo 
    public static JSONArray weatherItems = new JSONArray(); 

    // More stuff 

} 

logcat的

這裏是讓我覺得我的應用程序被殺害。在與其他應用程序一起玩時,會顯示這一點。

I/ActivityManager(2465): Process com.mysite.myapp (pid 23538) has died. 
I/WindowManager(2465): WIN DEATH: Window{4852a678 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{485b63a8 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{4826fbf8 com.mysite.myapp/com.mysite.myapp.ItemList paused=false} 
I/WindowManager(2465): WIN DEATH: Window{48286f90 com.mysite.myapp/com.mysite.myapp.ItemDetail paused=false} 
W/GpsLocationProvider(2465): Unneeded remove listener for uid 1000 
D/GpsLocationProvider(2465): stopNavigating 
D/gps_BRCM(2465): [status check] on_stop() : GPS_STATUS_SESSION_END 
D/gps_BRCM(2465): gps_engine_status_update 2 
D/GpsLocationProvider(2465): send an intent to notify that the GPS has been enabled or disabled 
D/gps_BRCM(2465): gps_stop: called 
V/GpsLocationProvider(2465): hybridGpsSensorDeregister : No registered sensorManager 
D/GpsLocationProvider(2465): hybridGpsSensorDeregister 

回答

1

1 - 這怎麼可能呢?

您的進程可能會在任何時候終止。您不能假定任何靜態數據成員或自定義對象將存活多長時間。它們最好只能用作緩存。

2-如何強制我的應用在退出背景時退出?

你不知道。

我知道我不應該這樣做

不僅如此,但它不會幫助你在這種情況下。它所要做的就是意味着你100%的時間崩潰,因爲你實際上並沒有正確地初始化。

但我找不到其他解決方案。

初始化您的數據。如果您的應用程序由於創建了新的自定義Application實例而崩潰,則Application子類中存在缺陷,您需要修復這些缺陷。

+0

你是什麼意思「初始化你的數據」。啓動應用程序時,會顯示一個啓動畫面,在此期間所有全局變量都將被初始化。沒有辦法讓數據只在應用程序被終止時被刪除(即當所有活動完成時)? – jul

+0

@jul:「啓動應用程序時,會顯示一個啓動畫面,在此期間所有全局變量都將被初始化。」 - 這不是一個明智的舉動。 「沒有辦法讓數據只在應用程序被終止時被刪除(即當所有活動完成時)?」 - 這就是已經發生的事情。但是,當操作系統決定時,「所有活動都已完成」,可以隨時進行。如果用戶離開您的應用,則Android可以隨時完成活動並終止流程。 – CommonsWare

+0

爲什麼將所有數據加載到啓動畫面(即啓動應用程序時)不是一個明智之舉?我從Web服務獲取它們,然後執行http請求+解析json會使應用程序的響應速度變慢。此外,當我在後臺打開應用程序(例如使用其他應用程序)時,它應該再次啓動並加載我的init數據,或者如果活動未被終止,則從我離開的位置開始。在前一種情況下,如果活動仍然存在,我的全局變量不應該被刪除,對吧? – jul

1

您應該使用適當的生命週期事件處理程序來保存數據並在重新激活時恢復它們:onSaveInstanceState(),onPause()和onResume()。你不能安全地假設你的全球領域將保持不變。

我建議你用Activity life-cycle來親身體驗。

0

@Override onPause在您的活動中,然後使用finish();

0

Application類用於初始化全局變量 - 因此您有這部分是正確的。但是,您必須在另一個類中聲明這些變量,因爲Application僅在應用程序重新啓動時調用 - 而不是在後臺啓動時調用。

您還應該在ApplicationonCreate()方法(使用@Override註釋)中進行這些初始化。

1

它很簡單,你必須在Application.OnCreate中初始化你聲明的變量,我剛剛測試過它的工作原理,當應用程序崩潰時它再次調用Application.OnCreate。

我希望能幫上忙。

0

我跑過一個類似的問題,基本上是這樣的文章解釋了很好http://www.developerphil.com/dont-store-data-in-the-application-object/

這是關鍵的段落和所發生的事情給你:

這給我們帶來了問題的核心:應用程序對象不會永遠留在內存中,它會被殺死。與流行的觀點相反,該應用不會從頭開始重新啓動。 Android會創建一個新的Application對象,然後開始用戶之前的活動,讓人感覺應用程序從未被殺死。

我知道這篇文章很舊,但認爲這可能對未來用戶有所幫助。