美文网首页
应用SharedPreferences在进程之间通信时你会遇到的

应用SharedPreferences在进程之间通信时你会遇到的

作者: 蒋帅Android | 来源:发表于2017-12-01 21:14 被阅读0次

应用SharedPreferences在进程之间通信时你会遇到的问题
出现这样一个问题:先启动主线程并获取SharedPreferences对象,然后对值进行修改,然后再启动其它进程并获取SharedPreferences对象,能够获取修改后的值,但此时如果对此值进行修改,均不能对其他进程产生作用。必须等到进程重启或者app重启才能与其他进程进行数据同步。

原因:只有在创建SharedPreferences对象的时候才会从磁盘中国进行读取,读取完以后值保存在内存(HashMap)当中,下次获取SharedPreferences对象优先从缓存当中获取,所以在当前进程修改了SharedPreferences的值,其他进程的SharedPreferences对象的值并不会改变。只有把当前另外的进程关闭(如:关闭手机、或杀死该app重新进入),再次创建进程时才会重新从磁盘中再次读取文件。

源码分析:通常我们获取SharedPreferences都是通过Context中的getSharedPreference方法来获取SharedPreferences对象,在Context中,getSharedPreference方法是一个抽象方法,没有具体实现。我们知道Context的实现类是ContextImpl,所以直接找到ContextImpl的getSharedPreference方法。可以看到,这里将SharedPreferences的实例对象SharedPreferencesImpl的先通过Map缓存起来,以后每次获取如果内存已经存在,那么直接返回,如果不存在才会重新创建。

那么为什么在同一个进程SharedPreferences应用又没有问题呢?
这是由于Editor 的实现类EditorImpl,但我们修改完SharedPreferences对象之后都会调用commit(直接当钱线程执行)或者apply方法(将当前任务加到线程池中,后台执行)才会执行保存,在源码中可以看到无论调用哪一个方法都会调用commitToMemory()和enqueueDiskWrite方法。commitToMemory()方法就是将值提交到内存当中。enqueueDiskWrite()将修改后的内容写入到磁盘当中。所以下一次取出的值是正确的。

相关文章

  • 应用SharedPreferences在进程之间通信时你会遇到的

    应用SharedPreferences在进程之间通信时你会遇到的问题出现这样一个问题:先启动主线程并获取Share...

  • 027 Android多进程-ContentProvider

    一、前言 之前介绍了几种进程间通信的方式,都是在同一个应用之间进行进程间通信的,那么,如果在不同应用之间进行程间的...

  • 来谈谈binder

    service与serviceManager之间的通信也是跨进程通信? 而Binder就是进程通信的中转站。下文会...

  • TCP和UDP协议

    1 运输层协议概述 1.1 进程之间的通信 网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑...

  • 第二章 进程的描述与控制5

    2.6 进程通信 1、进程通信是指进程之间的信息交换。 2、进程通信分为: 1)低级通信——进程之间的互斥和同步 ...

  • 什么是套接字

    应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。 多个TCP连接或多...

  • 进程间通信(应用之间通信)

    进程间通信(IPC)方式 使用Bundle 使用文件共享 使用Messenger 使用AIDL 使用COntent...

  • ssl

    进程之间的通信 同主机之间进程通信ipc shm 不同主机之间进程通信socket 主机port作用 主机上,每一...

  • 应用层协议之DNS、DHCP

    运输层为应用进程提供了端对端的通信服务,但不同的网络应用的应用进程之间,还需要有不同的通信规则。因此在运输层协议之...

  • 计算机网络自学笔记:TCP

    传输层协议为运行在不同主机上的应用进程之间提供逻辑通信功能。从应用程序的角度看,通过逻辑通信,运行不同进程的主机好...

网友评论

      本文标题:应用SharedPreferences在进程之间通信时你会遇到的

      本文链接:https://www.haomeiwen.com/subject/olqgbxtx.html