最近,我找到了一种方法来应对配置更改。我所做的是将要保护的对象声明为静态字段。这是一个好习惯吗?
答案 0 :(得分:4)
它从来都不是一个好习惯。根据我自己的经验,我制作了一个充满静态变量的音乐播放器应用程序,它的ram使用量超过75 mb,远远超过其他任何类型。原因是,它在活动被破坏时存储变量的值。如果你在位图或任何其他重型文件上有静态变量,它会造成内存泄漏,这是用户看不到的,因为并非所有设备都获得足够的资源(内存)来跟上大量使用应用程序。
静态变量通常会产生NullPointerExceptions,因为许多其他活动也会使用它们,并且变量为null可能会导致应用程序完全失败...
我建议你将数据存储在SharedPreferences中,只需创建一个像整数一样的静态字段,并始终使用它来从SharedPrefrences中检索值,它非常干净并减少NullPointers。此外,只有一个静态使你可以更好地控制你的应用程序...对我而言,它可以节省更改100个静态字段的时间,而不是更改1,因为它很容易和内存效率很高......
我希望,我可以帮助你一点!
答案 1 :(得分:2)
不是真的。您可能会导致内存泄漏,因为您的某个静态字段可以保存对当前Context的引用,该引用可以在没有引用的情况下销毁。
使配置更改生存的最佳方法是使用推荐的方法 - Bundles。如果你必须存储更大和/或更持久的东西 - 使用文件,SharedPreferences或数据库。
答案 2 :(得分:1)
使用static可能会导致nullpointer异常。因为当配置更改时,当前上下文被销毁,如果您访问这些上下文,则会抛出nullPointer异常。
所以sharedPreferences或database是存储数据的最佳选择。
希望这有帮助:)
答案 3 :(得分:1)
保留活动状态的方法之一,特别是在配置更改期间,是使用Fragments。
您可以通过在配置更改后重新启动活动时保留片段来减轻您的活动,而不是重新初始化您的活动。
当您在配置更改期间销毁活动时,Android系统不会销毁您标记为要保留的活动片段。
您可以将此类片段添加到活动中以保留有状态对象。
与使用“静态”相比,此方法在以下链接中被提倡:
http://developer.android.com/guide/topics/resources/runtime-changes.html
答案 4 :(得分:0)
我认为你不能在onSaveInstanceState中放入一些(非常好的)原因。所以我认为你必须与retain片段进行比较。
如果您的班级中有静态字段,例如:
static Object myStaticReference;
你不会再担心活动或碎片的onDestroy,onCreate,onSaveInstanceState的所有生命周期丛林混乱。这将大大减少代码行,使一切更容易调试和理解。在任何情况下,您的对象中都不会有任何对视图,活动,片段,上下文等的引用。 例如,如果你有这样的东西:
public class MyObject {
ArrayList metaData;
Context cntx;
public MyObject(Context cntx) {
this.cntx=cntx;
}
}
然后你仍然处于生命周期的丛林中,只要在onCreate中重新创建Activity并且仍然使用onSaveInstanceState进行管理,你将不得不传递(并重新设置)上下文的引用(以及你拥有的任何其他View关系)。有任何需要。所以在这种情况下它只是没用。
使用retain Fragment(我认为应该是另一种方式),事情也是不同的。即使在重新创建Activity时,retain Fragment也会持续,但你必须管理这个额外的片段(好的部分是你不需要这个UI)。