Android多进程的数据库访问问题

在Android开发中,我们可能会使用单独的进程来做一些事情,比如推送服务,心跳服务等,这些不需要主应用启动,只需要一个独立的进程即可。这时候我们一般都会采用启动一个后台Service,这个Service运行在一个独立的进程中,比如在Androidmainfest.xml中配置Service的android:process=”:push”指定该Service运行在:push进程中。

一般情况下这样做是没有任何问题的,但是如果你在你的Application的onCreate方法里有对数据库的操作,或者该Service里有对数据库的操作,就会有可能会有两个进程同时操作一个数据库的情况,一个是你的主应用的进程,进程名为你的包名例如org.flysnow;一个是你的Service所在的进程,进程名为你的包名+”:push”,即org.flysnow:push。这两个进程可能在同一时间访问同一个数据,同一个配置文件等。这就可能造成资源的竞争访问,造成的问题就不可预料了,比如数据库损坏,数据丢失等。

多进程其实和多线程一样,并发访问的时候产生的问题很难预料,在多线程的时候我们有锁等机制控制资源的访问,但是在多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现,毕竟在Android里一个进程就是一个VM虚拟机,底层的东西控制不了,Java层又没有办法控制,所以在多进程中一定不要有并发增删改文件的操作。

解决问题的核心就是不并发访问同一个文件,多线程时就使用Lock机制;多进程的时候就避免进行数据库的访问,比如只做一些心跳、激活、消息抓取等操作,涉及到把消息存储到数据库,访问配置文件等操作还是调用主进程进程操作。还一个要注意的就是Application的oncreate方法里要避免多进程访问同一文件,因为没一个进程初始化都会执行该方法,可以在一些进程初始化的时候不需要文件操作的时候不要进行文件操作,比如在onCreate里获取当前的进程,不等于包名的就不进行文件的访问操作,获取进程可以使用android.os.Process.myUid()方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ionic3+

【技巧】ionic多环境配置

这种方式稍显麻烦,也容易误操作,而比较优雅的方式是通过配置文件和命令行参数结合来实现。

21220
来自专栏风中追风

分布式基础__session 和 cookie的差异

HTTP协议是一种无状态的 通信协议 。那么这就以为着 客户端按道理是需要每次请求之前都要和服务器做连接的。 但是每次都进行这种连接,会非常耗时,并且这些重复...

397100
来自专栏魏艾斯博客www.vpsss.net

开启 CDN 后 wordpress 后台打不开的解决办法

55650
来自专栏章鱼的慢慢技术路

虚拟机的基本网络配置

31850
来自专栏云计算教程系列

如何在CentOS 7上配置Apache以使用自定义错误页面

Apache是世界上最受欢迎的Web服务器。它功能强大,功能丰富且灵活。在设计网页时,自定义用户看到的每条内容通常都很有帮助。包括他们请求不可用内容时的错误页面...

23700
来自专栏技术小黑屋

Android中系统设置中的清除数据究竟会清除哪些数据

What will be removed If you click Clear Data Button in the System Application

31610
来自专栏Java进阶

再谈session 和 cookie的差异

28780
来自专栏about云

zookeeper原理

问题导读 1.zk service什么情况下不可用? 2.zk写数据,什么时候才算完成? 3.zk读数据可以在任意一台zk节点上,为什么? 4.zk znod...

37760
来自专栏云计算教程系列

Nginx的安装和配置疑难解答

Nginx是一个免费的开源Web服务器,用于托管各种规模的网站和应用程序。该软件以其对内存资源的低影响,高可扩展性以及可提供安全,预测性能的模块化事件驱动架构而...

31450
来自专栏上善若水

S005SELinux(SEAndroid)的实际文件组成无标题文章

SEAndroid 是将SELinux 移植到Android 上的产物,可以看成SELinux 辅以一套适用于Android 的策略。

21050

扫码关注云+社区

领取腾讯云代金券