问题描述
我有一个包含3个活动的应用程序。
- 活动1
- 活动2
- 活动3
当用户打开应用程序时,我正在获取用户的位置并将其存储在Helper类的静态变量中。 可以说该变量是latlng。 现在,我需要在Activity2中访问latlng变量的值。 所以我只是在Activity2中使用Helper.latlng。 大多数情况下,它都能正常工作。
但是,如果我按下主页按钮并打开其他应用程序,然后返回到我的应用程序,我的应用程序将关闭。 调试后,我发现latlng变量在Activity2中变为空。
因此,在浏览了各种文档之后,我发现如果许多应用程序正在运行,那么Android OS可能会杀死某些应用程序。 因此,基本上,如果我打开其他应用程序,操作系统将破坏我当前的活动。 因此,我所有的静态变量都自动消失了。
解决此问题的一种方法是继续使用带有onSavedInstanceState方法的静态变量,该方法将在活动被销毁时调用。
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
LatLng latLng = Helper.latlng;
outState.putParcelable("latlng",latLng);
}
并使用
if( savedInstanceState != null ) {
Helper.latlng = savedInstanceState.getParcelable("latlng");
}
我真的很困惑是否应该采用上述方法。 还有其他方法可以在Android中的不同活动之间使用变量。 根据我的经验,我可以说使用静态变量不是一个安全的选择。
1楼
只是为了避开最重要的部分:除非您确切知道自己在做什么,否则绝对不要在Android中使用静态变量。 否则,您将造成内存泄漏和一系列其他问题。
如果要将数据传递到另一个活动,则应使用Intent。
方法调用总是有额外的开销。 直接访问字段总是会更快。 但这并不意味着您应该一起放弃吸气剂和吸气剂。
例如,查看此类示例:
public class Example {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public void doSomething() {
...
} }
在doSomething()内部,您应该直接使用该字段。 调用getter和setter方法是没有办法的,因为每次调用一个方法都需要额外的开销。
如果在另一个类似下面的类中使用Example类,则应使用getter和setter方法: Example instance = new Example(); instance.setText("some text"); ... String text = instance.getText();
Example instance = new Example(); instance.setText("some text"); ... String text = instance.getText();
将该字段公开并像instance.text一样直接访问它会很糟糕。
但是任何现代设备都具有如此大的计算能力,以至于方法调用所产生的开销可以完全忽略不计。 确实指出,您应该避免在性能至关重要的地方使用吸气剂和吸气剂,但这是从大多数Android手机具有128 MB RAM的时间开始的。 您应该遵守我上面解释的规则的主要原因仅仅是一件事:编码样式。
您首先要关心的是编写干净,可读和可维护的代码。
2楼
做到这一点的方法之一是使用android中的SharedPreferences
存储。
SharedPreferences pref =
getApplicationContext().getSharedPreferences("LocationPrefs", MODE_PRIVATE);
Editor editor = pref.edit();
// Save latLang as a string variable
editor.putString("latLang", "string value of latLang");
// Save the changes
editor.commit();
您可以通过这种方式检索结果,
String latLang = pref.getString("latLang", null);
3楼
在活动之间传递数据的方法很少。
- 保存到文件
- 使用putExtra的
在Android环境中,用户始终可以删除应用数据,因此无论如何您都需要为此做好准备