文档章节

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

代码会说话
 代码会说话
发布于 2012/05/18 18:14
字数 1448
阅读 16520
收藏 8

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

		@Override
		public void run() {
			if (cachedFloors.size() < 1) {
				try {
					setFloors(FloorDao.findAll());
				} catch (TcpException e) {
					// TODO Auto-generated catch block
					e.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 exception
					e.printStackTrace();
				}

			}

		}

	}

	public static synchronized void setFloors(List<Floor> floors) {
		if (hasFloor())
			return;
		cachedFloors.addAll(floors);
	}

 

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

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

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

 

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

 

© 著作权归作者所有

代码会说话
粉丝 184
博文 62
码字总数 58384
作品 0
南宁
后端工程师
私信 提问
加载中

评论(2)

1元4700套安卓源码+80G安卓学习视频 !!! 新店开张

http://weidian.com/i/1411913192?wfr=c
j
jiangguoqiang
企业级应用难免都会遇到这些数据同步问题,楼主的思想也不错,但是如果服务端删除了一条数据,那标识字段又该如何判断?
Android 异步编程

文章作者:朱鸿,淘宝资深架构师 原文出处:http://hugozhu.myalert.info/2014/06/29/46-async-android.html Android的线程和内存模型 Android操作系统在boot后,会启动一个Zygote(受精卵)进...

鉴客
2014/07/01
1K
1
一.Android省电开发之性能优化

电量优化 Android应用开发中的网络、定位、传感器等都是比较耗电的特性,我们应该正确使用API来有效降低应用的耗电量。 1.BroadcastReceiver: 在代码实现中需要尽量避免无用操作代码的执行,...

天王盖地虎626
06/20
36
0
Android手机功耗,高通/MTK功耗

功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7541658 android 功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7618452 MTK 驱动- https://blog.cs......

desaco
07/06
0
0
看了极光推送技术原理的几点思考

看了极光推送技术原理的几点思考 分类: android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报 目录(?)[+] 移动互联网应用现状 因为手机平台本身、电量、网络流量的限制,移动互联网应用...

thinkyoung
2015/04/10
0
0
Android--Alarm机制

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/53740938 Android中的定时任务一般有两种实现方式,一种是使用 Java API 里提供的 Time...

sealin
2016/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[转]详解netty原理分析

详解netty原理分析 Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,...

morpheusWB
15分钟前
1
0
for循环

九九乘法表 示例:for(int i = 1; i <= 9; i++){ for (int j = 1; j <= i; j++) { // 每次开始i循环,j都会重新定义为j=1,然后开始循环计算 System.out.print(j +......

Shutting
38分钟前
9
0
小王子1

一定要帅! 韩国设计师品牌 insgram全世界得网红 韩国潮男穿搭 HM 找到穿衣服最好看的人,跟他比,比他好看。 在兴趣前,不要表现目的性,压力 关系是不热就冷的! 不喜欢压力,不喜欢负责任...

阿锋zxf
56分钟前
11
0
时间戳

1 loadTimeString(ts) { var d = new Date(); if (String(ts).length == 10) { d = new Date(ts * 1000); ......

东方巨人
58分钟前
7
0
Redis Cluster

Redis Cluster 集群 redis集群有以下几种方式 普通一主多从 普通一主多从+哨兵 cluster分片模式 一主多从 搭建方式网上很多,就不多描述了。 这种集群方式,一般master用作写,slave用做读,...

lazy~
59分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部