android-cn / android-discuss

Android 问题交流讨论坛, 微信公众号:codekk, 网站:
https://github.com/android-cn/android-discuss/issues
Apache License 2.0
4.08k stars 536 forks source link

Android SharePreference多进程访问问题 #135

Open lizijin opened 9 years ago

lizijin commented 9 years ago

应用中保存用户登录成功后的用户信息。现在是用SharePreference保存。应用中有个Service 用android:process 放在另一个进程中。该Service也会访问(只读不写)SharePreference的数据。Service每隔30s 会去读取SharePreference。主进程在登录的时候会去写SharePreference。现在的问题是 偶现在主进程登录的时候 写数据的时候 会把SharePrefence文件删除掉。请问这是多进程导致的吗?该如何解决

goceancx commented 9 years ago

是不是使用sp(sharedpreference)的姿势不对 - -!

lizijin commented 9 years ago

怎样才算姿势对呢

zmywly8866 commented 9 years ago

这个应该不是多进程的问题,问题是可能出现读写冲突,正在读文件的时候又在写文件。你可以尝试避免同时读写的情况,然后验证是否还会出现你说的问题。

mthli commented 9 years ago

额,用synchronized关键字?(逃

andyiac commented 9 years ago

遇到同样的问题,等真相~

t12x3456 commented 9 years ago

使用MODE_MULTI_PROCESS,MODE_MULTI_PROCESS这个值是一个标志,在Android 2.3及以前,这个标志位都是默认开启的,允许多个进程访问同一个SharedPrecferences对象。而以后的Android版本,必须通过明确的将MODE_MULTI_PROCESS这个值传递给mode参数,才能开启多进程访问. 在2.3以后,因为默认不使用该mode,若读写是不同的进程,那么他们使用的其实是两个SharedPreference实例, 因此,需要判断版本,在2.3及以上使用MODE_MULTI_PROCESS打开SharedPreference

lizijin commented 9 years ago

最近研究了下,真相是这样的。在写SharedPreference的时候,会把xml做一个copy,生成xml.bak文件,每次写都是先保存到内存中然后对针对xml.bak文件做操作。读取的时候会先把xml.bak命名成xml,之后会删除掉。读写 都会对xml.bak做一个删除动作。这时呢 多进程就会出现同步问题。就是 xml.bak在将要命名成xml 文件时 被删除了。出现了文件丢失的情况。解决的话,多进程要不就用binder 解决 要不然用数据库吧

R1NC commented 9 years ago

SharedPreferences 源码 显示目前并不支持多进程:

Note: currently this class does not support use across multiple processes. This will be added later.

发现一个开源项目 tray,基于 ContentProvider 实现的,用 SQLite 作存储。 有兴趣的不妨看看。

philofly commented 9 years ago

http://blog.csdn.net/philofly/article/details/8588807,这是我写的。可以支持跨进程

lizijin commented 9 years ago

大哥跨进程是你那样玩的,但是没有解决我得问题 ,请看清问题和我的分析 @philofly

alongmoon commented 9 years ago

姜总V5

KingMountain commented 9 years ago

简单的只用“MODE_MULTI_PROCESS”,只想适配4.0以上设备的话,会出现什么问题呢?有可能出现的情况是怎样的呢?

ZhaoKaiQiang commented 8 years ago

不应该使用SharedPreference进行多进程通信,原因请看这里

LLin233 commented 8 years ago

@lizijin 有个问题,既然每次都是对xml.bak操作,那原有的xml至少会有一份留在local吧为什么会丢失?按删除操作看也不应该会把原有的xml删除啊,顶多是出现数据错误的问题

lizijin commented 8 years ago

@LLin233 原因就是数据同步出现问题。解决方案大概有两个 1,使用aidl通信,确保读取的是同一份内存 2,使用类似ContentProvider 原生支持多进程的组件 。如果有第三种 那就是自己实现吧

pkjueying commented 8 years ago

@RincLiu 我再使用Tray的过程中,发现有个时候两个进程之间数据还是不能保证同步