在多进程模式下使用SharedPreferences

Mou*_*ari 19 service android ipc multiprocessing sharedpreferences

我已经定义了SharedPreferences在多进程模式上使用的实例.

public class Prefs {

    private static SharedPreferences prefs;
    private static SharedPreferences.Editor editor;

    private static void init(Context context) {

        prefs = context.getSharedPreferences("alaki",
                Context.MODE_MULTI_PROCESS);
        editor = prefs.edit();
    }

// static methods to set and get preferences
}
Run Code Online (Sandbox Code Playgroud)

现在我在一个服务上使用这个类,使用单独的进程,也在我的主应用程序进程中以静态方式使用.
一切进展顺利,但有时会删除SharedPreferences实例上的所有存储数据!
我怎么解决这个问题?

编辑:最后我用IPC解决了我的问题.

Ahm*_*azy 34

目前无法安全访问SharedPreferences多个进程,如其文档中所述.

注意:此类不支持跨多个进程使用.

在经过大量测试后MODE_MULTI_PROCESS,我将分享三个试验:

1- 在每个过程中初始化SharedPreferences一次并多次使用它.

问题:这些值未按预期反映在每个流程中.因此每个进程都有自己的SharedPreferences值.

2- 初始化SharedPreferences每个put或get.

这实际上有效,现在价值可以在流程之间互换.

问题:有时在积极访问sharedpref之后,共享首选项文件被删除了所有内容,如本期所述,我在日志中收到此警告:

W/FileUtils? Failed to chmod(/data/data/com.hegazy.multiprocesssharedpref/shared_prefs/myprefs.xml): android.system.ErrnoException: chmod failed: ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

您可以在问题中找到这种情况的原因.

3- 使用同步来锁定放入和获取值的方法SharedPreferences.

这是完全错误的; 同步不适用于进程.在SharedPreferences实际使用同步在执行,但只保证线程安全,不处理的安全性.这被描述得非常好这里.


Vik*_*amV 6

SharedPreferences本身不是过程安全的.这可能就是SharedPreferences文档所说的原因

注意:目前此类不支持跨多个进程使用.这将在稍后添加.