Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中共享偏好的最佳选择是什么?_Android_Performance_Sharedpreferences - Fatal编程技术网

Android中共享偏好的最佳选择是什么?

Android中共享偏好的最佳选择是什么?,android,performance,sharedpreferences,Android,Performance,Sharedpreferences,如果我想读取数据并再次保存一些更改,那么在android中,共享首选项存储数据的最佳选择是哪个。 数据可以是用户的配置文件、json响应或任何对象。 由于我存储了大量数据,因此我正在搜索其他耗时较少的选项来Reda/写入数据。 当前我的应用程序从活动A转到活动B需要x毫秒。 我可以减少这次吗 我找不到更好的方法来保存用户数据。SharedReference就是为了这个目的而做的。而且SharedReference不应该阻止您加载活动。因此,可能会有其他因素降低您的性能。如果需要存储大量数据,则不

如果我想读取数据并再次保存一些更改,那么在android中,
共享首选项
存储数据的最佳选择是哪个。 数据可以是用户的配置文件、json响应或任何对象。 由于我存储了大量数据,因此我正在搜索其他耗时较少的选项来Reda/写入数据。 当前我的应用程序从活动A转到活动B需要x毫秒。
我可以减少这次吗

我找不到更好的方法来保存用户数据。SharedReference就是为了这个目的而做的。而且SharedReference不应该阻止您加载活动。因此,可能会有其他因素降低您的性能。

如果需要存储大量数据,则不应使用共享首选项,因为它可能会变得混乱。相反,您应该写入内部存储器。以下是您的选择:

**Shared Preferences**
Store private primitive data in key-value pairs.
**Internal Storage**
Store private data on the device memory.
**External Storage**
Store public data on the shared external storage.
**SQLite Databases**
Store structured data in a private database.
**Network Connection**
Store data on the web with your own network server.
最后三个是最难的,但前两个很容易。如果共享首选项中的数据太多,下面介绍如何存储到内部存储器:

注意:当用户卸载应用程序时,这些文件将被删除。 从:

要创建专用文件并将其写入内部存储器,请执行以下操作:

1。使用文件名和操作参数调用openFileOutput() 模式。

2。这将返回一个FileOutputStream。

3。使用Write()写入文件。

4。使用Close()关闭流。

例如:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
检索数据也非常简单:

1。调用openFileInput()并将要读取的文件名传递给它。这 返回文件输入流。

2。使用Read()从文件中读取字节。

3。然后用close()关闭流。

共享首选项可以很好地存储简单的键值对,如高分、用户设置等。如果要保存用户键入的文章,可以使用外部或内部存储

让我知道这是否有帮助


Ruchir

如果不深入了解您的用例,就很难向您推荐任何东西

  • 如果您想存储一些用户首选项数据-
    SharedReferences
    可能是一个不错的选择
  • 如果要存储身份验证数据,如用户的身份验证令牌,请不要使用
    SharedReferences
    ,而是查看
    AccountManager
  • 如果您想要存储业务数据,例如多个业务实体,它们彼此保持一些关系,那么您希望能够查询和/或修改它们-我建议您使用领域-。另一种选择是使用SQLite,但在我看来,从一开始就很容易
  • 如果您只想缓存一些基于JSON的响应,请查看HTTP客户端可能提供的缓存机制<例如,code>OkHttp对这一点有很好的支持
说到加载时间-
SharedReferences
通常非常快,但这取决于您如何使用它。如果您在其中存储大的JSON结构,那么完全阅读它只是为了根据id找到一些特定的对象——显然这比使用真正的数据库要花更多的时间


请记住,我提出的所有解决方案(
AccountManager
SharedPreferences
和SQLite/Realm)都可以在一个应用程序中完美地相互配合。只需确保为给定的问题选择合适的工具。

如果您正在寻找替代工具,因为自动备份存在危险,有一种方法可以从自动备份功能中排除您使用的特定SharedPref- 它是通过在xml文件中声明exclude标记,然后使用清单的application标记下的android:fullBackupContent属性引用它来实现的。 通过这样做,您仍然可以支持自动备份功能,而不必担心存储在Google Drive cloud上的敏感信息

好的推荐信:

Jetpack data Store是一种全新的、经过改进的数据存储解决方案,旨在取代SharedReference。基于Kotlin协程和流构建的数据存储提供了两种不同的实现:

数据以异步、一致和事务方式存储,克服了SharedReference的大多数缺点

如果您当前使用SysPoad存储数据,请考虑迁移到DATASTORE。 数据存储类型

数据存储提供了两种不同的实现:

首选项数据存储–使用键存储和访问数据。此实现不需要预定义的模式,也不提供类型安全性

原始数据存储–将数据存储为自定义数据类型的实例。此实现要求您使用协议缓冲区定义架构,但它提供了类型安全性

共享数据参考与数据存储

SharedReference阻止了由apply()调度的挂起的fsync()调用的UI线程,通常成为ANR的来源

SharedReferences将解析错误作为运行时异常抛出

在这两种实现中,数据存储将首选项保存在一个文件中,并在Dispatchers.IO线程上执行所有数据操作


参考资料:

您还可以使用更易于使用的Hawk库


请详细解释“快速/安全交易”的含义,并澄清
共享参考资料
如何不满足您的需要。@Commonware详细阐述了我的问题是存储身份验证令牌的安全领域?此链接突出了共享参考资料和Jet数据存储之间的区别: