多个共享首选项不保存/显示数据

时间:2018-05-17 16:58:01

标签: java android sharedpreferences indexoutofboundsexception

我搜索了很长时间但无济于事,因为我仍然不知道它为什么不起作用。

我已经在一个Activity和另一个

之间使用SharedPreference

代码:

保存数据

  SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString("email", email.getEmail().toString());
    editor.apply();

检索数据

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String userEmail = preferences.getString("email", "defaultValue");

    DisplayEmail.setText(userEmail);

此代码工作正常。但现在,当转向其他共享偏好时,会发生这种情况:

  

java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.nathan.application / com.example.nathan.application.ActCamera}:java.lang.IndexOutOfBoundsException:Index:0,Size:0           在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2796)           在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2867)           在android.app.ActivityThread.-wrap12(ActivityThread.java)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1570)           在android.os.Handler.dispatchMessage(Handler.java:105)           在android.os.Looper.loop(Looper.java:156)           在android.app.ActivityThread.main(ActivityThread.java:6595)           at java.lang.reflect.Method.invoke(Native Method)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:942)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)        引起:java.lang.IndexOutOfBoundsException:索引:0,大小:0

由于此错误导致的代码:

 double Latitude = loc.getLatitude();
            double Longitude = loc.getLatitude();

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor editor = preferences.edit();


            editor.putString("Country", details.doInBackground().toString());
            editor.putLong("Latitude", Double.doubleToRawLongBits(Latitude));
            editor.putLong("Longitude", Double.doubleToRawLongBits(Longitude));

            editor.apply();


 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    Latitude = Double.longBitsToDouble(preferences.getLong("Latitude", 0));
    Longitude = Double.longBitsToDouble(preferences.getLong("Longitude", 0));

2 个答案:

答案 0 :(得分:0)

有些情况下,getDefaultSharedPreferences在不同的应用程序上下文中无法正常工作。

我建议您使用:

Context mContext = getApplicationContext();
SharedPreferences preferences = mContext.getSharedPreferences("your_shared_preferences_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();

答案 1 :(得分:0)

  

多个共享首选项不保存/显示数据

这称为多进程 应用,您可以在其中定义清单类中的两个或更多进程。目前无法安全访问多个进程SharedPreferences,如documentation所述。

解决方案:

如果您想使用多进程,则将使用基于数据库的库托盘而不是SharedPreference。

https://github.com/grandcentrix/tray