Android中共享首选项的最佳替代方案是什么?

时间:2016-01-31 19:08:09

标签: android performance sharedpreferences

这是android中Shared Preferences存储数据的最佳替代方法,如果我想读取数据并再次保存一些更改。 数据可以是用户的配置文件,json响应或任何对象。 当我存储大量数据时,我正在搜索Reda / Write数据的其他耗时较少的选项。 目前我的应用程序需要x毫秒才能从活动A转到活动B. 我可以减少这个时间吗?

6 个答案:

答案 0 :(得分:18)

如果不深入了解您的用例,很难向您推荐任何内容。

  • 如果您想存储一些用户偏好数据,SharedPreferences可能是一个不错的选择。
  • 如果您想存储身份验证数据,例如您的用户' auth-tokens - 请勿使用SharedPreferences并改为AccountManager
  • 如果您想存储商家数据,例如多个商业实体,彼此保持一些关系,您希望能够查询和/或修改它 - 我建议您使用Realm - https://realm.io。另一种方法是使用SQLite,但在我非常主观的意见中,Realm更容易入手。
  • 如果您只想缓存一些基于JSON的响应 - 请查看HTTP客户端可能为您提供的缓存机制。例如,OkHttp对此有很好的支持。

说到加载时间 - SharedPreferences一般来说非常快,但这实际上取决于你如何使用它。如果你在其中存储大的JSON结构,那么完全读取它只是为了找到一些基于id的特定对象 - 显然它比使用真实数据库需要更多的时间。

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

答案 1 :(得分:2)

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

**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.

最后三个是最难的,但前两个很容易。如果您在共享首选项中有太多数据,那么如何存储到内部存储:

注意:当用户卸载您的应用程序时,将删除这些文件。 来自docs

创建私有文件并将其写入内部存储:

<强> 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()并将其传递给要读取的文件的名称。这个     返回一个FileInputStream。

<强> 2。使用read()从文件中读取字节。

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

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

如果有帮助,请告诉我,

Ruchir

答案 2 :(得分:1)

如果您正在寻找自动备份危险的替代方法有一种方法可以从autoBackup功能中排除您使用的特定SharedPrefs - 它是通过在xml文件中声明排除标记,然后使用清单的应用程序标记下的android:fullBackupContent属性引用它来实现的。 通过这样做,您仍然可以支持自动备份功能,而无需担心存储在Google云端硬盘云上的敏感信息。

好参考: https://developer.android.com/guide/topics/data/autobackup.html https://www.youtube.com/watch?v=HXacyy0HSW0

答案 3 :(得分:1)

Jetpack DataStore 是一种经过改进的新数据存储解决方案,旨在替代SharedPreferences。以Kotlin协程和Flow为基础,DataStore提供了两种不同的实现:

异步,一致和事务性地存储数据,克服了SharedPreferences的大多数缺点。

如果您当前正在使用SharedPreferences来存储数据,请考虑迁移到DataStore。

数据存储的类型

DataStore提供两种不同的实现:

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

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

SharedPreferences与DataStore

SharedPreference阻止了由apply()调度的待处理fsync()调用上的UI线程,通常成为ANR的来源。

SharedPreferences抛出分析错误作为运行时异常。

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

参考:DataStore – Jetpack Alternative For SharedPreference

答案 4 :(得分:0)

我找不到更好的方法来保存用户的数据。 SharedPreferences正是为此目的而制作的。并且SharedPreferences不应该阻止您的活动加载。所以可能会有其他因素降低你的表现。

答案 5 :(得分:0)

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

https://github.com/orhanobut/hawk