取代SharedPreferences的多进程解决方案
Android的SharedPreferences用来存储一些键值对, 但是却不支持跨进程使用.
跨进程来用的话, 当然是放在数据库更可靠啦, 本文主要是给作者的新库PreferencesProvider打个广告.
这是一个用ContentProvider实现的, 可以像SharedPreferences一样用于存储键值对, 支持跨进程使用.
SharedPreferences不支持多进程
SharedPreferences对多进程的支持不好, 你用什么mode也没用, 所以官方已经废弃了原先的MODE_MULTI_PROCESS, 并且建议跨进程存取值还是用ContentProvider之类的更靠谱一些.
说明见:
Context#MODE_MULTI_PROCESS
用ContentProvider来取代SharedPreferences 心路历程
之前项目中为了解决跨进程存取值的问题, 找了一个解决方案: grandcentrix/tray, 感觉还挺好用.
我们最后一次用的版本是tray的v0.10.0, 因为项目发布以后后台的崩溃里总是有相关的crash, 也是它的一个issue: https://github.com/grandcentrix/tray/issues/50
这个crash不是必现的, 概率比较低, 但是还是影响了一部分用户, 当我们解决了项目中的其他更重要的crash之后, 这个crash的排名就越来越靠前了.
后来作者做了一些改动, 说是在v0.11.0这个issue将会被修复, 但是这个版本却迟迟没有发布, 似乎作者做了一些很大的改动.
为了及时补救, 不再让用户体验到这个随机的崩溃, 我们决定放弃等待Tray的下个版本, 自己实现用ContentProvider来存取preferences.
实现过程用了BoD/android-contentprovider-generator来生成ContentProvider相关的代码.
我们把存preferences的表放在了自己的数据库里, 然后借鉴了Tray的接口, 封装了读取方法, 使之用起来和SharedPreferences类似.
之后我们就用自己写的新代码全面取代了Tray, 当然数据库升级时还需要对原来存在Tray里的重要数据进行迁移.
做完了这些以后, 发现可以做一个像Tray一样的库, 更简单, 造福其他人, 那么何乐而不为呢.
PreferencesProvider优势
- 基于ContentProvider实现, 支持跨进程使用;
- 采用模块化的管理方式, 可以将preferences分组管理;
- 没有Tray在v0.10.0版本的crash, 因为实现比Tray简单, 没有升级等功能.
(其实在我们实际项目的使用中, 基本上用不到对存preferences的表进行数据库升级的情况). - 使用方式简单, 见项目README说明:PreferencesProvider.
有用的工具
生成ContentProvider相关代码:
BoD/android-contentprovider-generator
只要定义数据库基本信息, 在json中定义表结构, 就可以生成所有相关代码.
查看数据库:
Stetho
在Chrome中像调试网页一样看Android应用的资源, 这个真是太好用了.
最后再次附上本文推荐的解决方案库: PreferencesProvider
取代SharedPreferences的多进程解决方案相关推荐
- SharePreference源码学习和多进程的场景
复习了下SharePreference的使用,以及了解下SharePreference的源码实现,解决多进程情况下的SharePreference问题,做下笔记. 参考文章: 源码分析: www.ji ...
- Android SharedPreferences 详解 源码解析
1.实现类 SharedPreferences 只是一个接口,其实现类是SharedPreferencesImpl. 工作流程分析: 创建sp 的时候,会去查看是否有bak文件,如果有的话,把bak文 ...
- sharedpreferences 重启不保存_MMKV为什么可以替换SharedPreferences
MMKV介绍 MMKV--基于 mmap 的高性能通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强. https://github.com/Tence ...
- TCP的困境与解决方案
TCP协议是互联网应用最广泛的数据传输协议之一,在过去的40年中改变了世界,但也成为了新的技术瓶颈.Cascade Range Networks, Inc CTO/联合创始人 范醒哲在LiveVide ...
- 物联网智能停车解决方案
物联网技术的进步为智能停车解决方案开发商提供了探索新机遇的方向.无处不在的计算创新加上云平台的发展,为智能停车解决方案公司开辟了新的途径.数据驱动运营的日益普及及其带来的好处正在导致全球停车软件的采用 ...
- android 开发从入门到精通
Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...
- 激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊
激光雷达Lidar与毫米波雷达Radar:自动驾驶的利弊 Lidar vs Radar: pros and cons for autonomous driving 新型无人驾驶汽车的数量在缓慢增加,各 ...
- 腾讯开源基于 mmap 的高性能 key-value 组件 MMKV
腾讯微信团队宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性.MMKV 从 2015 年中至今,在 ...
- python 网络编程第二版
为服务端增加多进程解决方案 1.server端代码如下: #!/usr/bin/python #!coding:utf-8import os,sys,time from socket import * ...
- 云计算,拼的就是运维
本文根据 InfoQ 中文站跟陈皓(@左耳朵耗子)在 2014 年 3 月的一次聊天内容整理而成. 在沟通中,陈皓分享了自己对云计算的理解,包括云计算为什么会分三层,实现一个云平台的难点在什么地方,运 ...
最新文章
- ScaleIO 1.32现在可以免费下载安装使用了(除生产环境之外)
- ----uni-app之用canvas同时画多张海报实现分享----
- 怎样去掉警告 log4j:WARN No appenders could be found for logger
- 少走弯路的十条忠告收藏
- 完全免费绝地求生吃鸡罗技宏
- 电动汽车动力系统整车仿真,具有双向DCDC变换器实现能量反馈,可带异步电机
- 沉迷那一抹秋色·禾木
- leetcode 每日一题 一起进步714 买卖股票的最佳时机含手续费
- 帝都机器人便利店_我把北京80%的便利店吃了个遍!吐血整理出这份帝都便利店大攻略!...
- 解决WPS公式上浮问题
- python 词库 匹配_python从一段文本中找出存在于词库的词语
- Avro RPC的两种实现方法:静态实现和动态实现
- 如何去除IDEA中xml文件的屎黄色背景
- 【算法百题之四十二】罗马数字转整数
- java pdf文件下载_Java后台返回PDF文件预览下载
- Cris 的 Scala 笔记整理(九):面向对象高级
- 33 +创意的蓝色网站设计的灵感
- 开源办公OA平台教程:如何修改O2OA配置连接本地部署的OnlyOffice Docs Server服务器?
- 错误代码: 1052 Column 'stu_id' in field list is ambiguous
- miui10 android版本,miui10稳定版
热门文章
- 【学堂在线数据挖掘:理论方法笔记】第五天(3.29)
- 智能优化算法:动物迁徙优化算法-附代码
- 《剑指offer》面试题20——顺时针打印矩阵(C++)
- 模板题——数位DP、状态压缩、记忆化搜索
- sklearn——决策树基础概念
- Windows开发——内存读写API
- Random在java中怎么用_java中random()函数用法介绍
- 实习踩坑之路:日期计算错误,Java8API导致Unsupported unit: Seconds,计算当前时间到凌晨00:00的计算方法
- android 可拖拽View的简单实现
- Flutter之MediaQuery详细分析