我最近将v4 support lib合并到我的Android应用程序中,以便在选项卡上滑动。我观察静态对象变为null的应用程序中的随机崩溃。
我通过以下帖子告诉我内存管理的故事,其中Android杀死进程以声明内存,重新启动进程并重新启动最新活动。
我也明白这就是为什么静态变量不是存储应用程序数据的好地方的原因。我正在调查偏好& DB作为替代品。但鉴于数据的复杂性,这需要一段时间。
编辑:我没有将数据存储在活动中,而是使用具有静态属性的类来保留应用程序级别的一组配置。
我的问题是,为什么在集成v4支持lib之后我会遇到这个问题?有谁支持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中观察NPE:getListOrder()方法,它引用其中一个静态变量。日志中是否有任何迹象表明系统已杀死该进程并重新启动它?或者他们表示不同的东西?
!@ Sync 406D / HierarchicalStateMachine(287):handleMessage:E msg.what = 83D / HierarchicalStateMachine(287):processMsg: ConnectedStateD / WifiStateMachine(287):ConnectedState {what = 83 when = -4ms arg1 = 5} D / HierarchicalStateMachine(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):已完成 处理出站队列I / fSharp:BackgroundThread(4637):在做 loop ... D / AndroidRuntime(4637):关闭VMW / dalvikvm(4637): threadid = 1:线程退出,未捕获异常 (group = 0x401b7760)E / AndroidRuntime(4637):FATAL EXCEPTION: 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):at com.tfs.fsharp.model.ListModel.handleListMessage(ListModel.java:285)E / AndroidRuntime( 4637):at com.tfs.fsharpsupport.background.BackgroundServiceHandler.handleMessage(BackgroundServiceHandler.java:104)E / AndroidRuntime( 4637):at android.os.Handler.dispatchMessage(Handler.java:99)E / AndroidRuntime( 4637):在android.os.Looper.loop(Looper.java:132)E / AndroidRuntime( 4637):at android.app.ActivityThread.main(ActivityThread.java:4028)E / AndroidRuntime( 4637):在java.lang.reflect.Method.invokeNative(Native 方法)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):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)E / AndroidRuntime( 4637):at dalvik.system.NativeStart.main(Native 方法)W / ActivityManager(287):强制完成活动 com.tfs.fsharp.ui.activity / .StartupActivityE / android.os.Debug(287): Dumpstate> / data / log / dumpstate_app_errorI / dumpstate(5407): beginD / HierarchicalStateMachine(287)
答案 0 :(得分:1)
显然,当您切换标签时,您的活动正在幕后被杀死。希望你知道life cycle of the Activity。
至于你的信息,使用静态变量delcares里面的活动并不是一个好习惯。您经常会遇到Null pointer exceptions
。如果您坚持使用静态变量而不是共享首选项或内容提供者,那么我认为您应该遵循以下方法。
我曾经有同样的问题,我有一个单独的类声明并用于静态变量。通过更多行和对Manifest文件的更改,您可以将它们设置为全局并在应用程序范围内使用它。