我有一个有三个活动的应用程序。这是我的Activity生命周期:Activity1 - > Activity2 - > Activity3。我的所有活动都使用“完全”相同的偏好。所以我创建了一个扩展类,用于我的所有活动。例
public class myPreferences extends Activity{
protected string PlayerName;
protected float maxPlayerHealth;
protected float minPlayerHealth;
// there are about 15 variables
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = this.getSharedPreferences("general_settings", Context.MODE_PRIVATE);
PlayerName = prefs.getString("PlayerName", null);
maxPlayerHealth = prefs.getFloat("PlayerName", 0.0f);
minPlayerHealth = prefs.getFloat("PlayerName", 0.0f);
//etc for rest of my preferences
}
这是我的每个活动的一个例子。
public class Activity1 extends myPreferences{
}
public class Activity2 extends myPreferences{
}
public class Activity3 extends myPreferences{
}
所以我的问题是,如果在我的类中使用静态变量更好,并且在我的应用程序中只运行一次sharedPreferences。示例i将检查玩家名称是否为空。
public class myPreferences extends Activity{
protected static string PlayerName;
protected static float maxPlayerHealth;
protected static float minPlayerHealth;
// there are about 15 variables
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(PlayerName ==null)
{
SharedPreferences prefs = this.getSharedPreferences("general_settings", Context.MODE_PRIVATE);
PlayerName = prefs.getString("PlayerName", null);
maxPlayerHealth = prefs.getFloat("PlayerName", 0.0f);
minPlayerHealth = prefs.getFloat("PlayerName", 0.0f);
//etc for rest of my preferences
}
}
哪两个方法更好? 1)内存使用情况如何?静态变量会使用更多内存吗?内存泄漏有风险吗? 2)两种方法中的哪一种会有更好的表现?我想如果我不读总是我的偏好,它会稍微好一些。 3)我应该使用私人签名而不是保护或无关紧要吗? 4)如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?每个活动一个扩展myPreferences类?
有很多事情需要解决,但我会尽我所能:
内存使用情况怎么样?
在Java中,当我们只声明类类型的变量时,只创建一个引用(不为该对象分配内存)。要为对象分配内存,我们必须使用new()。创建静态变量时使用Java中的堆栈内存。它包含特定于方法的原始值以及对该方法中引用的堆中对象的引用。对此内存的访问采用后进先出(LIFO)顺序。它的基本含义是,只要您创建一个静态变量,就会为其分配一块内存,并且该内存一直存在,直到您的应用程序关闭为止。
静态变量会使用更多内存吗?内存泄漏有风险吗?
更多记忆?没有!但它将基本上分配给它一块内存,直到应用程序关闭。 Is it risky for memory leaks?
-是的,它可能是因为它可能会创建一个循环依赖,可能不会让你的对象类型被破坏,我可能是错的,但在你的情况下不会发生。
这两种方法中的哪一种会有更好的表现?我想如果我不经常阅读我的偏好,它会稍好一些。
根据我的知识,静态可能会有更好的性能,因为您将在变量中携带它,而不必每次都从捆绑中获取它。
我应该使用私人签名而不是受保护或无关紧要
派生类不会继承对私有数据成员的访问权限。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。所以你可以根据你的用例来决定。
如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?每个活动一个扩展myPreferences类?
如果该项是静态的,它将只创建一次,静态变量就像一次性的东西。 One for each activity which extends the class myPreferences
-不,它不会
而是将这个逻辑捆绑到Activity
中,我会创建一个单独的类来封装你想要的行为。举个例子:
class PlayerSettings {
private static final String KEY_NAME = "com.my.packagename.PLAYER_SETTINGS_NAME";
//Again for other keys...
private final SharedPreferences prefs;
PlayerSettings(SharedPreferences prefs) {
this.prefs = prefs;
}
String name() {
return prefs.getString(KEY_NAME, "");
}
float maxHealth() {
return prefs.getFloat(KEY_MAX_HEALTH, 0.0f);
}
float minHealth() {
return prefs.getFloat(KEY_MIN_HEALTH, 0.0f);
}
}
用法:
final SharedPreferences prefs = PrefenceManager.getDefaultSharedPreferences(this);
final PlayerSettings player = new PlayerSettings(prefs);
player.maxHealth();
player.name();