Rx Preferences05 Oct 2015
Android’s SharedPreferences offers a convenient mechanism to persist a collection of key-value pairs.
- Ask it for values with
- Save values with
- Listen for changes with
It’s simplistic API makes it limiting for a few reasons:
- Callers must always know the preference key and type.
- No support for storing custom types out of the box.
- Callers cannot listen for changes to individual keys.
SharedPreferences requires callers to always know what key identifies a preference when they get or save a preference. Callers also need to keep track of what type was used for a preference (did the preference use a
int), which can lead to subtle bugs.
RxPreferences introduces a
Preference class, that identifies key used to store it and the type of data it holds, making it easier to spot such bugs at compile time.
RxSharedPreferences provides factory methods to promote preferences to objects.
Preference class provides methods that replace their counterparts in
SharedPreferences.Editor. This makes it convenient to use them as the source of truth, instead of sharing
String constants throughout your app.
SharedPreferences restricts you to a set of limited types —
Set<String>. Trying to persist custom types is doable, but looks awkward.
RxPreferences introduces a pluggable
Adapter abstraction. An
Adapter can store and retrieve values of an arbitrary type, and consolidates your serialization logic into a single location.
RxPreferences provides built in adapters for all the types suppored by
SharedPreferences and enums. Writing a custom adapter is trivial. You can even use your own favorite serialization library!
Then, simply let RxPreferences know which adapter you want to use.
OnSharedPreferenceChangeListener requires that listeners observe changes to all keys. Callers must filter values for the keys they’re interested in.
Preference class integrates with RxJava, and lets you observe changes to a single preference directly. Internally, RxPreferences shares a single listener amongst all
Preference objects to avoid unnecessary work.
RxPreferences also lets you take actions on preferences to update or delete values. This makes it straightforward to set up complex pipelines by combining it with other libraries in the RxJava family.
For example, RxPreferences and RxBinding can be combined to hand roll your own simplified
RxPreferences makes it convenient to interact with
SharedPreferences, and integrating with RxJava makes it easy to express complex logic that would otherwise have been tedious and brittle. RxPreferences is available on Maven Central. Check the Github repo or u2020 to see more examples.