前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android多进程的数据库访问问题

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

作者头像
飞雪无情
发布2018-08-28 10:50:01
2K0
发布2018-08-28 10:50:01
举报
文章被收录于专栏:飞雪无情的博客

在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()方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年3月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档