使用扩展类的多个活动的SharedPreferences

时间:2019-04-29 08:44:00

标签: java android memory-management memory-leaks

我有一个包含三个活动的应用程序。这是我的活动生命周期:活动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吗?

2 个答案:

答案 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();