2013-03-12 48 views
3

我最近將v4 support lib合併到我的Android應用程序中,以啓用跨選項卡的滑動操作。我觀察到靜態對象變爲空的應用程序中的隨機崩潰。靜態變量在合併v4庫後變爲空

我通過以下帖子告訴我內存管理的故事,Android會殺死進程以聲明內存,重新啓動進程並重新啓動最新的活動。

我也明白這是爲什麼靜態變量不是存儲應用程序數據的好地方。我正在尋找& DB作爲替代選擇。但考慮到數據的複雜性,這需要一段時間。

編輯:我沒有將數據存儲在活動中,而是使用具有靜態屬性的類來保存應用程序級別的一組配置。

我的問題是,爲什麼我在集成v4支持庫後面臨這個問題?有沒有人遇到與支持v4 lib類似的問題?這與我的問題或我的模糊假設有什麼關係?

Can static variable value be nulled by system in android app?

Android static object lifecycle

static variable null when returning to the app


這裏是我的應用程序的日誌時崩潰。我在ApplicationConfiguration:getListOrder()方法中觀察NPE,它引用了一個靜態變量。有沒有跡象表明系統已經殺死了這個進程並重新啓動了它?或者他們指出不同的東西? !

@Sync 406D/HierarchicalStateMachine(287):的handleMessage:電子 msg.what = 83D/HierarchicalStateMachine(287):processMsg: ConnectedStateD/WifiStateMachine(287):ConnectedState {什麼= 83 時= - (287):handleMessage: XW/PowerManagerService(287):定時器0x3-> 0x3 | 0x0D/dalvikvm(2775): GC_EXPLICIT已釋放61K,5%空閒6209K/6531K,暫停 6ms + 2msI/fSharp:BackgroundServiceHandler(4637):收到的消息: 3I/fSharp:BackgroundServiceHandler(4637):列表消息處理程序 存在,發送messageI/fSharp:BackgroundThread(4637):Completed (4637):關閉VMW/dalvikvm(4637): threadid = 1:線程以未捕獲異常退出 (group = 0x401b7760)處理出站隊列I/fSharp:BackgroundThread(4637):在執行 循環... D/AndroidRuntime )E/AndroidRuntime(4637):致命例外: mainE/AndroidRuntime(4637): java.lang.NullPointerExceptionE/AndroidRuntime(4637):at com.tfs.fsharpsupport.common.configuration.ApplicationConfiguration.getListOrder(ApplicationConfiguration.java :125)E/AndroidRuntime( 4637):at com.tfs.fsharp.model.ListModel.refreshList(ListModel.java:576)E/AndroidRuntime( 4637):at com.tfs.fsharp.model.ListModel .onListChanged(ListModel.java:332)E/AndroidRuntime( 4637):在 com.tfs.fsharp.model.ListModel.handleListMessage(ListModel.java:285)E/AndroidRuntime( 4637):在 com.tfs.fsharpsupport.background.BackgroundServiceHandler.handleMessage(BackgroundServiceHandler。java:104)E/AndroidRuntime( 4637):at android.os.Handler.dispatchMessage(Handler.java:99)E/AndroidRuntime( 4637):at android.os.Looper.loop(Looper.java:132 )E/AndroidRuntime( 4637):at android.app.ActivityThread.main(ActivityThread.java:4028)E/AndroidRuntime( 4637):at java.lang.reflect.Method.invokeNative(Native Method)E/AndroidRuntime(4637):at java.lang.reflect.Method.invoke(Method.java:491)E/AndroidRuntime( 4637):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java :844)E/AndroidRuntime( 4637):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)E/AndroidRuntime((原始 方法)W/ActivityManager(287):強制整理活動 com.tfs.fsharp.ui.activity/.StartupActivityE/android.os.Debug(287):在dalvik.system.NativeStart.main(原生 方法) dumpstate> /數據/日誌/ dumpstate_app_errorI/dumpstate(5407): beginD/HierarchicalStateMachine(287)

+0

可能你的apk現在變大了,因此可能會遇到內存問題,特別是當你的靜態變量中有很多數據的時候。然而,kill和restart應該由日誌指示。 – njzk2 2013-03-12 10:03:24

+0

你能否請回顧下面的日誌並告訴我服務是否被殺死了? – 2013-03-12 11:47:10

回答

1

顯然你的活動正在幕後爲您完成標籤交換殺害。希望你知道life cycle of the Activity

至於你的信息,使用靜態變量delcares裏面的活動不是一個好習慣。您經常會遇到Null pointer exceptions。如果你堅持使用靜態變量通過共享首選項或內容提供者,那麼我認爲你應該遵循下面的方法。

我曾經有同樣的問題,我有一個單獨的類聲明和使用它的靜態變量。通過對Manifest文件的更多行和更改,您可以使它們成爲全局的,並在應用程序範圍內使用它。

Check out this tutorial on how to do this