我有一个包含三个活动的应用程序。这是我的活动生命周期:活动1->活动2->活动3。我所有的活动都使用完全相同的首选项。 因此,我创建了一个扩展类,该类可用于我的所有活动。 例子
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。例如,我将检查玩家名称是否为空。
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吗?
答案 0 :(得分:1)
有很多事情要讲,但是我会尽力的:
那内存使用情况如何?
在Java中,当我们仅声明类类型的变量时,只会创建一个引用(未为该对象分配内存)。要将内存分配给对象,我们必须使用new()。在创建静态变量时,将使用Java中的堆栈内存。它包含特定于方法的原始值以及对从该方法引用的堆中对象的引用。对该存储器的访问按后进先出(LIFO)顺序进行。它的基本含义是,一旦创建一个静态变量,就会为其分配一块内存,并且该内存将一直存在,直到您的应用关闭。
静态变量会占用更多内存吗?内存泄漏有风险吗?
更多内存?没有!但是它将基本分配有一块内存,直到关闭应用程序为止。 Is it risky for memory leaks?
-是的,可能是因为它可能创建一个循环依赖关系,这可能不会破坏您的对象类型,我可能是错的,但在您的情况下不会发生。
这两种方法中哪一种会有更好的性能?我认为,如果我不总是阅读自己的喜好,将会略胜一筹。
据我所知,静态可能会具有更好的性能,因为您可以将其包含在变量中,而不必每次都从捆绑软件中获取。
我应该使用私有签名而不是受保护的签名吗?
派生类不继承对私有数据成员的访问。但是,它确实继承了完整的父对象,该对象包含该类声明的所有私有成员。因此,您可以根据自己的用例进行决定。
如果同时在堆栈中打开我所有的活动,变量将被重新创建3次吗?每个活动都可以扩展类myPreferences吗?
如果该项是静态的,那么它将仅创建一次,静态变量就像一次性的东西。 One for each activity which extends the class myPreferences
-不,
答案 1 :(得分:1)
相反,我将此逻辑绑定到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();