Java 使用扩展类的多个活动的SharedReference
我有一份有三项活动的申请。这是我的活动生命周期:活动1->活动2->活动3。我的所有活动都使用“完全”相同的首选项。 因此,我创建了一个扩展类,用于我的所有活动。 范例 下面是我每项活动的一个例子Java 使用扩展类的多个活动的SharedReference,java,android,memory-management,memory-leaks,Java,Android,Memory Management,Memory Leaks,我有一份有三项活动的申请。这是我的活动生命周期:活动1->活动2->活动3。我的所有活动都使用“完全”相同的首选项。 因此,我创建了一个扩展类,用于我的所有活动。 范例 下面是我每项活动的一个例子 public class Activity1 extends myPreferences{ } public class Activity2 extends myPreferences{ } public class Activity3 extends myPreferences{ } 所以我
public class Activity1 extends myPreferences{
}
public class Activity2 extends myPreferences{
}
public class Activity3 extends myPreferences{
}
所以我的问题是,在我的类中使用静态变量,并且在我的应用程序中只运行一次SharedReferences是否更好。例如,我将检查玩家名称是否为空
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)顺序访问此内存。它的基本意思是,只要你创建了一个静态变量,就会给它分配一段内存,这个内存一直存在,直到你的应用程序关闭 静态变量将使用更多内存?内存泄漏有风险吗 更多的记忆?不但在应用程序关闭之前,它基本上会分配一块内存<代码>内存泄漏有风险吗?-是的,可能是因为它可能会创建一个循环依赖项,该依赖项可能不会让您的对象类型被破坏,我可能是错的,但在您的情况下不会发生这种情况 这两种方法中哪一种性能更好?我想如果我不经常阅读我的偏好,它会稍微好一点 据我所知,静态可能具有更好的性能,因为您将在变量中携带它,而不必每次都从包中获取它 我应该使用私人签名而不是受保护的签名,还是不重要 派生类不继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。因此,您可以根据您的用例来决定 如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?扩展类myPreferences的每个活动一个
如果项目是静态的,它将只创建一次,静态变量就像一次性的东西<代码>每个扩展myPreferences类的活动一个-不,它不会有很多内容需要涵盖,但我会尽我所能: 内存使用情况如何 在Java中,当我们只声明一个类类型的变量时,只创建一个引用(不为对象分配内存)。要将内存分配给对象,必须使用new()。在创建静态变量堆栈时,将使用Java中的内存。它包含特定于方法的基元值和对堆中对象的引用(从方法引用)。以后进先出(LIFO)顺序访问此内存。它的基本意思是,只要你创建了一个静态变量,就会给它分配一段内存,这个内存一直存在,直到你的应用程序关闭 静态变量将使用更多内存?内存泄漏有风险吗 更多的记忆?不但在应用程序关闭之前,它基本上会分配一块内存<代码>内存泄漏有风险吗?-是的,可能是因为它可能会创建一个循环依赖项,该依赖项可能不会让您的对象类型被破坏,我可能是错的,但在您的情况下不会发生这种情况 这两种方法中哪一种性能更好?我想如果我不经常阅读我的偏好,它会稍微好一点 据我所知,静态可能具有更好的性能,因为您将在变量中携带它,而不必每次都从包中获取它 我应该使用私人签名而不是受保护的签名,还是不重要 派生类不继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。因此,您可以根据您的用例来决定 如果我的所有活动同时在堆栈中打开,变量将被重新创建3次?扩展类myPreferences的每个活动一个
如果项目是静态的,它将只创建一次,静态变量就像一次性的东西<代码>一个用于扩展类myPreferences的每个活动-不,它不会而是将此逻辑绑定到一个
活动
,我会创建一个单独的类来封装您想要的行为。例如:
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();
我宁愿创建一个单独的类来封装所需的行为,而不是将此逻辑捆绑到
活动中。例如:
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();
这没关系——不管它值多少钱,我不会把它放在一个基本的活动中,而是创建我自己的PlayerSettings
类,它保留了所有这些内部内容,并且只公开了name()
、maxHealth()
和minHealth()
的访问器,但这取决于您。如果您采用这种方法,那么我建议不要将值设置为静态值,因为它们是全局可修改的。我对其他解决方案持开放态度。你能举个例子吗?任何例子