【发布时间】: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