【问题标题】:SharedPreferences values are not coming if i am modifying default SharedPreferences file internally如果我在内部修改默认 SharedPreferences 文件,SharedPreferences 值不会出现
【发布时间】:2017-08-22 07:04:28
【问题描述】:

如果我在内部修改默认 sharedPreferences 文件,SharedPreferences 值不会出现。但是,如果我正在关闭和打开应用程序,那么它会很好。

由于某些要求,我将 sharedPreferences 文件存储在谷歌驱动器中。之后,我使用相同的谷歌帐户在其他设备中恢复相同的 sharedPreferences 数据,所有 xml 数据都很好。但在 sharedPreferences 对象中,这些值不会刷新。但是,虽然关闭和打开应用程序值会很好。

如何在不关闭应用程序的情况下刷新 sharedPreferences?

以下是我在默认文件路径强文本中编写 sharedPreferences 文件的方法。

private void restore(Context ctx, InputStream myInputs, String path) {
  OutputStream myOutput;

  try {
     myOutput = new FileOutputStream(path);

     byte[] buffer = new byte[1024];
     int length;
     while ((length = myInputs.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
     }

     // Close and clear the streams
     myOutput.flush();
     myOutput.close();
     myInputs.close();
     googleDriveBackUpActivity.setBackUpInfo();
     Toast.makeText(ctx, R.string.successfully_restored_from_google_drive, Toast.LENGTH_SHORT).show();

  } catch (IOException e) {
     e.printStackTrace();
  }
}

【问题讨论】:

  • 我很确定SharedPreferences 在第一次加载后会缓存,这样它就不需要一直打到磁盘上。与其直接写入 xml 文件,不如使用SharedPreferences.Editor,以便 Android 知道何时使缓存无效。

标签: java android sharedpreferences google-drive-android-api


【解决方案1】:

SharedPreferences 缓存值,因此它不需要每次都访问磁盘。文档明确规定您应该只通过Editor 写入首选项文件,否则您会遇到意外行为:

对首选项的修改必须通过 SharedPreferences.Editor 对象,以确保首选项值保持一致状态并控制何时提交到存储。从各种 get 方法返回的对象必须被应用程序视为不可变对象。

不要只是覆盖默认文件,而是尝试从文件中读取 xml,然后通过 Editor 将其写回应用的共享首选项中以同步值。

【讨论】:

  • 另外,一个可能值得尝试的技巧(但我现在无法测试):在覆盖文件之前调用getSharedPreferences().edit().clear().apply()。这应该会破坏您现有的偏好,我怀疑这也可能使缓存的值无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多