我最近将v4 support lib合并到我的android应用程序中,以便能够在标签页之间滑动。我观察到应用程序中静态对象变为空的随机崩溃。
我浏览了下面的帖子,其中讲述了一个关于内存管理的故事,android通过终止进程来声明内存,重新启动进程并重新启动最新的活动。
我也理解这就是为什么静态变量不是存储应用程序数据的好地方。我正在寻找首选项和数据库作为替代。但考虑到数据的复杂性,这需要一些时间。
已编辑:我不是在活动中存储数据,而是使用具有静态属性的类在应用程序级别保留一组配置。
我的问题是,为什么在集成了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,它引用其中一个静态变量。日志中是否有任何迹象表明系统已终止进程并重新启动它?或者它们表明了一些不同的东西?
!@同步406d/层次结构状态机(287):handleMessage:e
msg.what=83d/hierarchicalstatemachine(287):处理消息:
connectedstated/wifistatemachine(287):已连接状态{what=83
when=-4ms arg1=5}d/层次结构状态机(287):handleMessage:
xw/powermanagerservice(287):计时器0x3->0x3 0x0d/dalvikvm(2775):
gc_显式释放61k,5%释放6209k/6531k,暂停
6ms+2msi/fsharp:backgroundservicehandler(4637):收到的消息:
3i/fsharp:backgroundservicehandler(4637):列表消息处理程序
存在,发送消息i/fsharp:backgroundthread(4637):已完成
正在处理出站queuei/fsharp:backgroundthread(4637):in do
循环…D/AndroidRuntime(4637):关闭vmw/Dalvikvm(4637):
threadid=1:线程未捕获异常而退出
(组=0x401B7760)E/AndroidRuntime(4637):致命异常:
缅因州/安德罗迪兰蒂姆(4637):
Java.Lang.Null PoEnguleExpTyON/ANDROIDRunTimes(4637):AT
COF.TFS.FSARPFoo.Cuff.So配置.Apple配置.GETListOrror(Apple St配置.java:125)E/AndroidRuntime(
4637):AT
COF.TFS.FCHAP.Mult.ListMault.RealHistList:ListMault.java(576)E/AndroidRuntime(
4637):AT
COF.TFS.FCHAP.Mult.ListMault.OnListC改(ListMeal.java:332)E/AndroidRuntime(
4637)
COF.TFS.FCHAP.Mult.ListMeal.HANDLELISTEMT(ListMeal.java:285)E/AndroidRuntime
4637):AT
com .tfs.fSARPField.Base.ButoService Service处理程序. HoalLeMeSeAd(ButoService Service处理程序. Java:104)E/AndroidRuntime
4637):AT
Addio.OS.Halder-Debug消息(处理程序:Java:99)E/AndroidRuntime
4637):在安卓.OS.Looper-Loor(Looper-Java:132)E/AndroidRuntime(
4637):AT
Actudio.App.ActuviyTrime.Mead(ActuviyTo.Java:4028)E/AndroidRuntime
4637):在java.
方法)e/androidruntime(4637):at
Java.Lang.Eng.Simult.PosiKe(方法.java:491)E/AndroidRuntime
4637):AT
COM.Android .No.OS.ZyGoTynIt $方法和AgSculal.Run(ZyGoTynIt.java:844)E/AndroidRuntime(
4637):AT
COM.Android .No.OS.ZyGoTeInIt .主(ZyGoTynIt.java:602)e/AndroidRuntime(
4637):达尔维克系统,Nativestart.Main(本地
方法)w/activitymanager(287):强制完成活动
com.tfs.fsharp.ui.activity/.startupactivitye/android.os.debug(287):
转储状态>/data/log/dumpstate\u app\u errori/dumpstate(5407):
begind/hierarchicalstatemachine(287)
最佳答案
很明显,当你交换标签时,你的活动在幕后被扼杀了。希望你知道life cycle of the Activity。
至于您的信息,在活动中使用静态变量delcares不是一个好的实践。你经常会遇到Null pointer exceptions
。如果您坚持使用静态变量而不是共享首选项或内容提供程序,那么我认为您应该遵循以下方法。
我曾经遇到过同样的问题,我声明了一个单独的类,并将其用于静态变量。通过对清单文件进行更多的行和更改,您可以使它们成为全局的,并在应用程序范围内使用它。
Check out this tutorial on how to do this。