【问题标题】:Saving custom array in shared preferences在共享首选项中保存自定义数组
【发布时间】:2017-08-19 06:29:00
【问题描述】:

我即将编写一个小型应用程序,其中几乎所有数据都存储在包含列表视图的自定义数组中。我不想以不同的形式保存数据。这个数组我喜欢保存在共享首选项中。我寻找其他已回答的问题并尝试了不同的方法,但没有一个对我有用。

在主要活动中,我有两个小方法:

public class MainActivity extends AppCompatActivity {

public static ArrayList<Item> items = new ArrayList<Item>();
SharedPreferences mPrefs = getBaseContext().getSharedPreferences("KEY12", Context.MODE_PRIVATE);
Gson gson = new Gson();

[...]

protected void savePrefs() {

    SharedPreferences.Editor editor = mPrefs.edit();
    String json = gson.toJson(items);
    System.out.println(json);
    editor.putString("items_prefs", json);
    editor.commit();

}

protected void loadPrefs() {

    String empty_list = gson.toJson(new ArrayList<Item>());

    items = gson.fromJson(mPrefs.getString("KEY12", empty_list),
            new TypeToken<ArrayList<Item>>() {}.getType());


}
}

我在 onCreate 中调用 loadPrefs(); 方法,在 onResume 中调用 savePrefs();,所以每次我回到主要活动时,都应该更新首选项。

我得到的错误是:

致命异常:主要 进程:com.example.android.calc123,PID:30579 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.example.android.calc123/com.example.android.calc123.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'android.content.SharedPreferences android. content.Context.getSharedPreferences(java.lang.String, int)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在 com.example.android.calc123.MainActivity.(MainActivity.java:61) 在 java.lang.Class.newInstance(本机方法) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1078) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我该如何解决这个问题或 - 以不同的方式询问 - 在处理共享偏好时我做错了什么?

【问题讨论】:

    标签: java android arrays sharedpreferences


    【解决方案1】:

    正如错误日志所说,您在空指针 (getBaseContext) 中调用 getSharedPreferences

    输入 OnCreate mPrefs = getBaseContext().getSharedPreferences("KEY12", Context.MODE_PRIVATE);

    【讨论】:

    • 感谢您的回答,不幸的是我仍然收到空指针的错误...
    • 试试getApplicationContext()。可能是由于您的上下文为空。
    • 移除 getBaseContext()。它应该与活动上下文一起使用
    • 我现在尝试了 'getApplicationContext().' 和简单的 'this.' - 两者仍然导致相同的错误。
    猜你喜欢
    • 2014-01-16
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多