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

如果你正在找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

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

  1. android中的定时任务一般有两种机制,android 定时任务

    使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...

  2. Android中后台线程如何与UI线程交互

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须 ...

  3. android post json格式,Android中post请求传递json数据给服务端的实例

    在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid","clientType": ...

  4. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  5. android json传输数据到服务器,Android中post请求传递json数据给服务端的实例

    在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid", "clientType" ...

  6. Android中手机录屏及数据解析

    Android中手机录屏及数据解析: 获取手机录屏数据: 01.手机权限获取 //动态请求权限的数组 //请求权限的数组,可以在数组中添加你需要动态获取的权限 private val PERMISSI ...

  7. Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略

    文章目录 流程图 why ? How ? 何时触发数据同步的机制? 同步哪些数据 同步方式 DIFF 同步 TRUNC+DIFF 同步 TRUNC 同步 SNAP 同步 同步后的处理 源码分析 流程图 ...

  8. 【Android】【功能设计】离线数据同步方案

    这里考虑的是本地数据不会被其它用户修改的情况,类似于微信,离线任务都是自己要发出的消息,不会和网络数据产生冲突 对于多个离线用户,同时修改同一份数据的情况,不适合使用此方案,大多时候也不允许离线使用 ...

  9. Android中解析JSON形式的数据

    转自:http://shazhuzhu1.iteye.com/blog/974758 1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的 ...

最新文章

  1. Linux操作系统下以不同颜色命名的文件类型
  2. Lua === Lua 十分钟基础入门上手
  3. crond和crontab
  4. div 隐藏_CSS实现六边形Div图片展示效果
  5. 任务03——简单程序测试及 GitHub Issues 的使用
  6. react-webpack config webpack@3.4.1
  7. 重写RadGrid及其注意事项
  8. scipy.misc.imresize
  9. 使用Cmder替换cmd,让你的开发飞起来
  10. chrome插件“京东商品佣金助手”之项目介绍(一)
  11. 前端面试 - 项目流程
  12. pytest系列教程——4、fixture详解
  13. 你的生命有什么可能 读书笔记
  14. 重要信息通知短信解决方案
  15. 视觉工程师笔试知识汇总
  16. 逆置线性表(线性表)
  17. 数商云精细化工行业管理平台一体化信息化解决方案
  18. 《RA-UNet: A hybrid deep attention-aware network to extract liver and tumor in CT scans》
  19. 一根网线,让整栋宿舍楼熄灯后不再吵闹
  20. 最适合新手的python刷题网站_有没有适合新手练习Python的网站(做题类)?

热门文章

  1. 取得Repeater内部控件命令名与命令参数
  2. Cocoapods的安装以及使用(2)
  3. iOS下拉tableView实现上面的图片放大效果
  4. python中package机制的两种实现方式(转载)
  5. 互联网业务安全之通用安全风险模型
  6. 浅析正则表达式模式匹配的 String 方法
  7. concat和concat_ws()区别及MySQL的几个实用字符串函数
  8. 软件破解系列之OD中断方法
  9. MyEclipse插件安装
  10. cmd库的导入Java,在cmd命令窗口导入第三方jar包来运行java文件