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

问题描述 投票:0回答:2

我有一个有三个活动的应用程序。这是我的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 android memory-management memory-leaks
2个回答
1
投票

有很多事情需要解决,但我会尽我所能:

内存使用情况怎么样?

在Java中,当我们只声明类类型的变量时,只创建一个引用(不为该对象分配内存)。要为对象分配内存,我们必须使用new()。创建静态变量时使用Java中的堆栈内存。它包含特定于方法的原始值以及对该方法中引用的堆中对象的引用。对此内存的访问采用后进先出(LIFO)顺序。它的基本含义是,只要您创建一个静态变量,就会为其分配一块内存,并且该内存一直存在,直到您的应用程序关闭为止。

静态变量会使用更多内存吗?内存泄漏有风险吗?

更多记忆?没有!但它将基本上分配给它一块内存,直到应用程序关闭。 Is it risky for memory leaks?-是的,它可能是因为它可能会创建一个循环依赖,可能不会让你的对象类型被破坏,我可能是错的,但在你的情况下不会发生。

这两种方法中的哪一种会有更好的表现?我想如果我不经常阅读我的偏好,它会稍好一些。

根据我的知识,静态可能会有更好的性能,因为您将在变量中携带它,而不必每次都从捆绑中获取它。

我应该使用私人签名而不是受保护或无关紧要

派生类不会继承对私有数据成员的访问权限。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。所以你可以根据你的用例来决定。

如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?每个活动一个扩展myPreferences类?

如果该项是静态的,它将只创建一次,静态变量就像一次性的东西。 One for each activity which extends the class myPreferences-不,它不会


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();
© www.soinside.com 2019 - 2024. All rights reserved.