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