当前位置: 首页 > 编程日记 > 正文

Android中后台定时任务实现,即时数据同步问题思考!

为什么80%的码农都做不了架构师?>>>   hot3.png

如果你正在找Android后台定时任务实现,那么你找对了,但是其实如果你正在找Java后台任务实现,你就不会找到我的这个博客了.但是我的实现方式没有使用多少Android相关的东西.确实.但是如果你进来了,Thank you!你还是会看到一些东西的.

一:需求: 我的一些数据一开始是从服务端读取出来的,但是随着时间的改变,我本地改变了一些数据.服务器的一些数据也发生了改变.一开始,但用户查看这些数据的时候,我再去服务器上将数据下载下来. 但是每次去下,有些数据变化不太.这个下载操作的的很大一部分就是白下载了.所以我开始探索解决方案:

二:解决方案:

(1) 下载前先检测服务端数据是否有发生了变化.数据库中的每一行记录都有一个字段标识数据是否发生改变了的时间.

于是先下载数据库记录最后改变时间. 我用前次下载得来的最后改变时间与当前下载得的时间对比.如果下载回来的时间大于我原来存储的时间.那么我便决定去下载数据....就这样它一直工作着.. 我觉得这样可以了.

但是,后来出现了数据没有同步的问题.因为有些对于数据记录的操作并没有改变那个标识了时间改变的字段.

所以方法失效.

(2)保证所以操作都改变时间标识字段.

这个方法有几点行不通,这个应用本身是从原来已经有的应用移植.所以服务端的后台数据库不能轻易改变.改变了也比较难以保证所以用户得及时更新的服务器中后台数据库.

最关键的是如果后台数据更新频繁,事实上我们的应用就是这样的.那么检测更新没有多大意义.因为几乎每次检测的结果都是需要更新. 在更新这个时间里,因为网络不稳定问题.用户等待时间太久.用户体验就明显下降了.这个检测更新也就完全没有什么意义了.

(3) 目前解决办法.

使用一个后台线程以一个比较合理的频率定时更新数据.

针对后台线程,由于做android开发的习惯.我们可能会想到使用Service.

但是真的需要Service吗?一开始我尝试这样,于是开始找Service的资料.我承认我对Service不熟悉...

我只使用绑定本地Service的方法,每次Activity创建就会重新绑定一次.但那没有关系.因为当时那个LocalService是读取SQLite数据库中的数据了.而且只读取一次放到缓存中(其实就是内存).

但是通过绑定的方法每次Activity启动等都会创建然后销毁服务.于是我就不想要了..

我希望我的应用启动前开始我的后台线程,结束时取消后台线程..仅此而已.于是我找其它的方式.如startService和stopService等方式,及为了让服务不被Android给杀掉可以把服务设置为前台服务.

但是,后台线程,为什么一定要用Service呢?我想,我所要进行的操作根据不需要Service.

还记得没有,想要在应用中全局共享变量,一个方法就是给应用设置一个自己子类化的Application.

但是,我看文档时发现,其实如果没有必要你根本可以使用一个静态单例来实现类似Application子类的功能.

我是比较听说的人,所以我就按文档要求的,自己实现静态单例了.需要使用Context的方法传进去就是了.

说了这么多,其实就是说,我们完全可以不用理会Service,应用就是在本地应用中使用.在自己的静态单例中实现就可以了.

而我确实也是这样做的.

在应用的主Activity的onCreate()方法中开始后台线程的执行.在此Activity的onDestory()方法中.结束后台线程的执行.

OK,满足需求了.

关键代码如下 :

public static void startSyncTableStauts(int seconds) {TimerTask timerTask = new TableStatusSyncTimerTask();timer = new Timer(true);timer.scheduleAtFixedRate(timerTask, 100, seconds * 1000);}public static void stopSyncTableStatus() {timer.cancel();cachedFloors.clear();cachedTables.clear();}private static class TableStatusSyncTimerTask extends TimerTask {@Overridepublic void run() {if (cachedFloors.size() < 1) {try {setFloors(FloorDao.findAll());} catch (TcpException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (Floor floor : cachedFloors) {try {List<Table> tables = TableDao.findByFloorId(floor.id);statusMap.put(floor.id, false);for (Table table : tables) {String key = floor.id + "#" + table.getTabid();cachedTables.put(key, table);}statusMap.put(floor.id, true);Log.i("DiApplication", " finish update table in floor:"+ floor.id);} catch (TcpException e) {// TODO: handle exceptione.printStackTrace();}}}}public static synchronized void setFloors(List<Floor> floors) {if (hasFloor())return;cachedFloors.addAll(floors);}

为什么要使用同步,因为我执行的是网络操作,如果后台线程还没有取回数据.我在前台程序中,就会自己主动去下载数据.

(为什么不等待数据有的时候. 因为如果网络出错.还是在前台程序中处理比较好.要让用户看到.) 下载好之后就将数据放到缓存中,因为是用List的所以不想出现线程问题所以就用同步了...

整个对于缓存的使用的应用代码也是放在AsyncTask内的doInBackground()内中去的.所以应用体验就比较好的.

暂时写到这里.如什么不正确的地方请各位同学指出来哈!

转载于:https://my.oschina.net/banxi/blog/57984

相关文章:

面对996,程序员如何利用“碎片时间”涨薪?

图片来源|视觉中国作为一个程序员&#xff0c;需要不断学习更新知识技能来提升自己。但爆炸式的信息量&#xff0c;总使人抓不到学习重点。所以&#xff0c;笔者为大家筛选了几个程序员会阅读的小众公众号&#xff0c;覆盖全面&#xff0c;囊括了不同的技术类别。小道消息&…

JakartaEE Exception: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUs...

异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUserByNameat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227) ~[mybatis-3.4.6.jar:3.4.6]at org.a…

【Qt】AVFrame转QImage

FFmpeg的AVFrame转成Qt的QImage //头文件 #ifdef __cplusplus extern "C" {#endif #include <libavcodec/avcodec.h> #include <libavcodec/avformat.h>

C# 回发或回调参数无效

回发或回调参数无效。在配置中使用 <pages enableEventValidation"true"/> 或在页面中使用<% Page EnableEventValidation"true" %> 启用了事件验证。出于安全目的&#xff0c;此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务…

【QT】Qt正则表达式的使用:使用QRegExp来限制QLineEdit的输入格式

QLineEdit中使用QRegExp来限制输入格式,下面以IP输入框为例 QLineEdit *lineEditIP = new QLineEdit("192.168.147.200", this);QRegExpValidator *reg = new QRegExpValidator(GW::RegExp::ipRegExp(), this)

小小的Python编程故事

现在Python的火热已经不是整个编程界的事情了&#xff0c;Python的火热已经蔓延到小学、大学课程&#xff0c;之前看新闻报道说青岛的小学生课程里都开始设置Python的课程了&#xff0c;大学里由原来必考的VB也改成了Python。一时大家都掀起了学习了Python的热潮&#xff0c;而…

python 验证码识别示例(二) 复杂验证码识别

在这篇博文中手把手教你如何去分割验证&#xff0c;然后进行识别。 一&#xff1a;下载验证码 验证码分析&#xff0c;图片上有折线&#xff0c;验证码有数字&#xff0c;有英文字母大小写&#xff0c;分类的时候需要更多的样本&#xff0c;验证码的字母是彩色的&#xff0c;图…

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》真诚感谢你选用《信息系统项目管理师考试考点分析与真题详解》作为高级项管的辅导用书。对于使用该书的读者们&#xff0c;在备考2012.5.26信息系统项目管理师考试之下午案例分析和论文写作考试时&#xff0c;以下一…

告别低分辨率网络,微软提出高分辨率深度神经网络HRNet | CVPR 2019

来源 | 微软研究院AI头条&#xff08;ID&#xff1a;MSRAsia&#xff09;作者简介&#xff1a;孙可&#xff0c;中国科学技术大学信息学院在读博士生&#xff0c;目前在微软亚洲研究院视觉计算组实习&#xff0c;导师是王井东和肖斌老师。他的研究兴趣包括人体姿态估计、语义分…

sudo提权实战讲解 对用户对组的权限配置分析

Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要&#xff0c;再来提升权限执行。 sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码&#xff0c;就可以…

【Qt】在Ubuntu16.04中安装QSerialPort模块

1、问题描述 在pro中添加&#xff1a;QT serialport 编译时报错&#xff1a;Project ERROR Unknown module(s) in QT:serialport 2、解决方法 安装QSerialPort模块库 sudo apt-get install libqt5serialport5-dev

Velocity文档(3)

2019独角兽企业重金招聘Python工程师标准>>> velocity.properties 的一些配置项 velocimcro.library属性&#xff1a;指定自己的模板库&#xff0c;多个模板库以逗号分隔。默认情况下&#xff0c;velocity查找唯一的一个库&#xff1a;VM_global_library.vmvelocima…

Java 24岁!Google加持的Kotlin真能取代它?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1995 年 5 月 23 日&#xff0c;Sun 公司在 Sun world 会议上正式宣布了 Java 的到来&#xff0c;从此一代编程语言界的翘楚就此诞生。而在不断地迭代与适配中&#xff0c;今时今日&#xff0c;Java 以需…

三,ES6中需要注意的特性(重要)

-----书接上文&#xff0c;前文中我们总结了关于JS的组成部分以及如何快速开展学习JS&#xff0c;相信已经有很多朋友掌握到这些方法。接下来就从更深的ECMAScript开始说起。 1.什么是ES6? ECMAScript(European Computer Manufacturers Association) 6: 是JavaScript语言的下一…

【SVN】在阿里云上创建svn服务器

1、创建用户及相关设置 阿里云搭建ubuntu18.04工作台&#xff0c;默认只有root超级用户。为了安全起见&#xff0c;我们使用普通用户来创建svn&#xff1a; useradd hello // 创建用户hello mkdir -p /home/hello // 在hello用户的根目录 cd /home/hello chown hello . // 设…

【转】on delete cascade

关系表的级联更新&#xff1a; on update cascade on delete cascade 是级联删除的意思 意思是 当你更新或删除主键表时&#xff0c;那么外键表也会跟随一起更新或删除 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSER…

倒计时1天!CTA核心技术及应用峰会报名通道即将关闭(附参会攻略)

全球智能化趋势当前&#xff0c;人工智能技术正蓬勃发展。为了直击开发者在机器学习与人工智能技术研究与落地过程中的痛点与瓶颈&#xff0c;深入解析机器学习和知识图谱技术在行业中的实践和落地。2019 年 5 月 26 - 27 日&#xff0c;由中国 IT 社区 CSDN 与数字经济人才发展…

【Qt】在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效的解决方法

1、问题描述 Win10操作系统环境下,在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效。 2、原因分析 Ctrl+Shift+f快捷键在各种输入法中,常用来做中文简体和繁体输入的切换。QtCreator中该快捷键失效的的原因,多半是因为和输入法的快捷键冲突。可以在输入法的快捷…

Python修行之字符串(一):连接、切割、大小写、排版

字符串:1.是由一个个字符组成有序的序列&#xff0c;是字符的集合2.字符串是不可变对象3.使用单引号、双引号、三引号引住的字符序列4.python3中、字符串就是unicode类型、在2中分两种一种unicode一种非unicode字符串元素访问--下标:1.字符串支持使用索引访问2.有序的字符集合&…

UI自动化测试随笔

昨天给开发的同事讲我们正在做的自动化测试&#xff0c;同事问了句&#xff1a;为什么API的测试不需要写代码了&#xff0c;而UI的测试还需要写那么多代码呢&#xff1f; 能不写代码么&#xff1f; 目前我们的自动化测试的现状&#xff1a; 目前主要覆盖两个部分&#xff1a;A…

【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...

(跃迁之路)专栏 【跃迁之路】奖励金计划正式开始 从2018.7.1起&#xff0c;【跃迁之路】奖励金计划正式起航&#xff0c;从今以后&#xff0c;&#xff0c; 每月1日&#xff0c;我会将自己个人上月收入的1%计入【跃迁之路】奖励金池&#xff0c;积累到足够金额后&#xff0c;将…

TensorFlow 2.0来了,为什么他却说“深度学习框架之争,现在谈结果为时尚早”?...

记者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;半个多世纪前&#xff0c;浙江大学老校长竺可桢曾有两个非常经典的教育问题&#xff1a;“诸位在校&#xff0c;有两个问题应该自己问问&#xff0c;第一&#xff0c;到浙大来做什么&#xff1f;第二&#…

【FFmpeg】ffmpeg工具源码分析(一):main函数

ffmpeg工具经常用来转换、生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret;BenchmarkTimeStamps ti; # 用于基准测试init_dynload(); # 初始化动态库加载路径,只在win3

Android之传感器(一)

传感器的种类&#xff1a;1. 动作传感器加速度传感器、重力传感器和陀螺仪&#xff08;判断手机姿态&#xff09;等2. 位置传感器方向传感器和磁力传感器3. 环境传感器温度传感器 、压力传感器和亮度传感器 使用传感器的方法&#xff1a;1. 获取SensorManager对象SensorManage…

【Qt】Qt单例模式三种实现

1、饿汉式 在头文件中:将构造函数私有化,并创建静态函数instance来获取实例 class A : public QObject {Q_OBJECT public:static A* instance(QObject *parent = nullptr);private:explicit A(QObject *parent = nullptr); }

程序员敲代码时,戴着耳机究竟在听什么?

今天&#xff0c;某妹子突然凑到我的耳边轻声说&#xff1a;“我们公司的程序员&#xff0c;清一色的戴着耳机&#xff0c;你说他们是不是故意不想听我们提的需求&#xff1f;”我很方&#xff0c;因为我也喜欢戴耳机。&#xff08;思考ing&#xff09;思考了一秒钟后&#xff…

关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题

关于Oracle.ManagedDataAccess数据库表加字段后&#xff0c;必须重启的问题&#xff0c;解决方法如下&#xff1a;在数据库连接字串中&#xff0c;增加一个参数&#xff1a;Metadata Poolingfalse如“Data Source(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOST1.1.6.200…

配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据

第一章 简介 场景描述 根据最近客户的需求&#xff0c;他们需要自动维护MOSS2010列表数据导出到Excel的数据实时同步&#xff0c;就是列表添加记录后&#xff0c;导出的Excel列表自动同步数据过来。 第二章 配置方法 1. 打开MOSS2010站点http://moss:8001的要导出的列表 2. 点【…

一个让Python代码运行更快的最佳方式!

作者 | Serdar Yegulalp译者 | 姜松浩&#xff0c;责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Python因其强大、灵活且易于使用等特性&#xff0c;而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用。但是就语言的设…

《Python基础教程第二版》第五章-条件、循环和其他语句(一)

print和import print打印多个表达式&#xff0c;用逗号,隔开 print abc:, 42, nonono #输出在每个参数之间添加空格 print在结尾处加上逗号,,接下来的语句会与前一条语句打印在同一行 print hello, print word! #hello word! import从模块中导入函数 import module from module…