sharedPref中的静态方法导致我的应用崩溃

时间:2014-11-19 18:40:39

标签: java android sharedpreferences

我在使用sharedPref的活动之间传递一个字符串。 我正在努力使我的代码更有效,而且我有一个我无法弄清楚的奇怪问题。

我在MainActivity.class中的代码:

  

@覆盖      protected void onCreate(Bundle savedInstanceState){          super.onCreate(savedInstanceState);          的setContentView(R.layout.activity_main);

    //if statement for the first run of the app, else statement uses the defined city.
    if (SharedPref.getCity().equals("")) {

    } else {
        cityText = (TextView) findViewById(R.id.prefCity);
        cityText.setText(SharedPref.getCity());
    }

我的SharedPref.java:

public class SharedPref {
private static SharedPreferences mSharedPreferences;

//sharedPref Manager.
public SharedPref(final Context context) {
    mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

}

public static void setCity(String item) {
    mSharedPreferences.edit().putString("city", item).apply();
}

public static String getCity() {
    return mSharedPreferences.getString("city", "");
}

}

如您所见,在我的MainActivity.class中,我通过“SharedPref.getCity()”访问数据。 直接来自类,这就是我使用静态方法的原因。 但应用程序崩溃了。 奇怪的是,如果我在MainActivity中初始化我的sharedpref,就像这样:

SharedPref sharedPref = new SharedPref(getBaseContext());

那么应用程序工作得很好,即使是sharedPref也是一个甚至不使用过的变量!

我错过了什么?

p.s这是我的logcat pic: logcat

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

最初共享首选项甚至不包含var“city”,所以最初条件应该是sharepref.contains(“city”),然后在进一步的迭代中检查它的值。

答案 1 :(得分:0)

setCity方法中,您使用的mSharedPreferences尚未初始化。

您需要创建SharedPref类的新实例,并使setCity无静态。

或者如果您希望setCity是静态的,可以执行以下操作:

public static void setCity(Context context, String item) {
    if(mSharedPreferences == null)
        mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

    mSharedPreferences.edit().putString("city", item).apply();
}

答案 2 :(得分:0)

看看这段代码:

public static final String SETTINGS_NAME = "MY_SETTINGS";
public static final String FB_TOKEN = "FB_TOKEN";
public static final String LANGUAGE = "LANGUAGE";

public static boolean writeString(Context context, String name, String value)
{
    SharedPreferences settings = context.getSharedPreferences(SETTINGS_NAME, 0);
    Editor editor = settings.edit();
    editor.putString(name, value);

    return editor.commit();
}

public static boolean writeInt(Context context, String name, int value)
{
    SharedPreferences settings = context.getSharedPreferences(SETTINGS_NAME, 0);
    Editor editor = settings.edit();
    editor.putInt(name, value);

    return editor.commit();
}

public static String readString(Context context, String name, String defValue)
{
    SharedPreferences settings = context.getSharedPreferences(SETTINGS_NAME, 0);
    return settings.getString(name, defValue);
}

public static int readInt(Context context, String name, int defValue)
{
    SharedPreferences settings = context.getSharedPreferences(SETTINGS_NAME, 0);
    return settings.getInt(name, defValue);
}

请注意" SETTINGS_NAME"是架构的名称。其他静态名称只是为了让它更容易。