我保留了一个静态共享首选项来访问多个活动中的值。
现在,我已经设定了警报,以便在某个时间起飞。现在在那个广播接收器中,我正在尝试访问共享的pref变量。
它已在另一个活动中初始化,并在那里返回正确的值。
但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的价值。
因为它是静态的,值不应该保持不变吗?
这是共享偏好类。
package com.footballalarm.invincibles;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
public class SessionManagement {
// Shared Preferences
public static SharedPreferences pref;
// Editor for Shared preferences
public static Editor editor;
// Context
Context _context;
// Shared pref mode
int PRIVATE_MODE = 0;
// Shared pref file name
private static final String PREF_NAME = "invincibles_alarm";
// All Shared Preferences Key
public static final String PREF_MATCH = "match";
// Constructor
public SessionManagement(Context context){
this._context = context;
pref = _context.getSharedPreferences(getPrefName(), PRIVATE_MODE);
editor = pref.edit();
editor.commit();
Log.e("Pref Match Value-constructor for pref", getValueMatch());
}
public static void fillValues(String match){
try{// Storing login value as TRUE
editor.putString(PREF_MATCH, match);
// commit changes
editor.commit();
Log.e("Pref Match Value-in fill values", getValueMatch());
}
catch(Exception e)
{Log.e("fillValues", e.toString());}
}
public static String getValueMatch(){
return pref.getString(PREF_MATCH, "Loading Match");
}
public static String getPrefName() {
return PREF_NAME;
}
}
我尝试在其他活动中记录输出并正确返回。
当我运行应用程序然后在发生警报之前将其关闭时,由于广播接收器无法访问共享的pref,程序会因空指针异常而崩溃。
我已经尝试过这个解决方案 - SharedPreferences in BroadcastReceiver seems to not update?但我只是在清单中使用名字给接收者。
只有在我通过最小化菜单在ICS中关闭我的应用时才会发生这种情况。
答案 0 :(得分:1)
检查此链接:
在您的情况下,静态变量可能会失去其价值。
静态变量在以下情况中可能会失去价值:
1)卸载班级。
2)JVM关闭。
3)过程终止。
而不是使用静态变量和函数,尝试使用公共类。
希望有所帮助
编辑1:
将公共类用于首选项而非静态方法的示例代码
public class PreferenceForApp {
Context context;
SharedPreferences prefs;
public PreferenceForApp(Context context) {
this.context = context;
prefs = context.getSharedPreferences(AllConstants.PREFS_NAME, 0);
}
public Boolean getIsDeviceValidated() {
return prefs.getBoolean("Validated", false);
}
public void setIsDeviceValidated(Boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("Validated", value);
editor.commit();
}
}
在您的代码中添加:
PreferenceForApp myPref = new PreferenceForApp(contxt);
myPref.getIsDeviceValidated();
有用的相关链接:
Android static object lifecycle
Why are static variables considered evil?
Android : Static variable null on low memory
编辑2
TEST 当您的静态变量丢失值时:
您可以使用几行代码进行测试:
在您活动的onCreate中打印未初始化的静态 - >应该打印null
初始化静态。打印它 - > value将为非null
点击后退按钮,进入主屏幕。注意:主屏幕是另一项活动。
再次启动您的活动 - >静态变量将为非null
从DDMS(设备窗口中的停止按钮)终止您的申请流程。
重新开始您的活动 - > static将具有null值。
我提到了这个链接Android static object lifecycle