上一篇我们提到calendar时有错误,那就是当软件退出后,关闭后台运行,下次进入的时候就不会再更新,达不到我们定时更新的效果。其实我们可以搭建数据库,每天按时更新数据库。但是总不能每天12点半人工更新吧。其实你也可以定个闹钟每天提醒你定时更新,如果你愿意的话。好了,作为程序员,能用代码解决的事就不叫事。所以我们可以用算法来实现就算后台退出了,每次打开的时候检查是否该更新,并执行是否更新。

这个问题比较复杂,我们首先来实现第一点,每日更新:

首先,什么情况下更新?

1.如果昨天的12:30到今天的12:30这段时间内没有更新,那么我们应该要更新,且只能更新一次。

2.如果这次是第一运行,那么我们应该在12:30以后进行更新,且只能更新一次

3.如果前面超过一天没有更新,那么我们一打开界面就应该更新,且只能更新一次。

注意:我们每次更新后的一天内都不能再更新,因为我们要实现每天只能更新一次

要实现以上的功能,我们得一步一步来。因为涉及到每次更新的时间,我们要用到当前在该年的天数,这里我们就不考虑闰年(这很简单,就是个判断),每次获得当前的天数与上次更新的天数进行比较,有几种情况:

1. 如果在同一天,且大于13点或等于12点大于30分,就更新一次。

2. 如果当前的天数等于更新的天数加1,说明昨天已更新,那么今天也要更新,同样大于13点或等于12点大于30分更新一次

3. 如果当前的天数大于更新的天数加1,说明超过一天没更新,那么一旦打开软件就要更新。

实现: 我们根据代码来讲解:

int []a = new int[4];             //保存现在的时间int []b = new int[4];              //保存上次的时间Calendar calendar=Calendar.getInstance();            //获取系统时间a[0]=calendar.get(Calendar.HOUR_OF_DAY);             //获取当前时间的小时a[1]=calendar.get(Calendar.MINUTE);                  //获取当前时间的分钟a[2]=calendar.get(Calendar.DAY_OF_YEAR);            //获得每年第几天a[3]=calendar.get(Calendar.DAY_OF_WEEK);            //获取当前是本周哪一天SharedPreferences SP=getSharedPreferences("data",MODE_PRIVATE);b[0]=12;b[1]=30;b[2]=SP.getInt("day_of_year",a[2]);               //获得上次更新时候的天数b[3]=SP.getInt("day_of_week",a[3]);               //获得上次更新时候的位置boolean Bo=false,bo=SP.getBoolean("isRefresh",true);  //每次更新bo的值,达到一天只更新一次的目的if(a[0]>13||a[0]==12&&a[1]>30) Bo=true;                //第一次更新if(a[2]==b[2]+1)                                       //昨天已更新if(a[0]>13||a[0]==12&&a[1]>30) {Bo=true;bo=true;}if(a[2]>b[2]+1) {Bo=true;bo=true;}                     //多天未更新if(Bo&&bo){SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();editor.putInt("day_of_year",a[2]);editor.putInt("day_of_week",a[3]);editor.putBoolean("isRefresh",false);editer.apply();
}

 
 

现在,我们来模拟一边过程。第一次打开页面,进入第一次更新,Bo=true,bo=true,执行一次,这里我调用了AlarmManager每个1s调用一次,所以再次调用后,Bo=true,bo=false,不能执行。一直持续到第二天,此时当你打开页面,a[2]=b[2]+1 执行昨天已更新,Bo=true,bo=true,执行一次.那么a[2]=b[2],运行第一次更新,Bo=true,bo=false。不能再运行。同理多天为更新。这样一来,就实现了每次打开页面检查并执行是否更新。

下面,我们来看看稍微有点复杂的每周日12:30的定时更新。因为牵涉到周几,所以我们要调用Calendar.DAY_OF_WEEK.这里注意,AS是国外的,按照外国人的习惯,一周的第一天是周日。那么每次更新的条件又有什么?

1.如果当前的星期几比上次更新的星期几小,比如现在星期1,上次更新星期2,那么一定经过了星期日,所以此时直接更新,同样只更新一次

2.如果当前所在该年的天数>=上次更新的天数+7,说明超过一周未更新,此时也是直接更新,且只更新一次

3.如果今天刚好周日,且大于13点或等于12点大于30分,可以更新,且只能更新一次

实现代码如下:

 boolean Ao=false,ao=SP.getBoolean("isRefresh1",true);if(a[2]==b[2]&&a[3]==1&&(a[0]>13)||(a[0]==12&&a[1]>30))           //今天刚好周日Ao=true;if(a[2]>=(b[2]+7)%366) {Ao=true;ao=true;}                                 //超过七天未更新if(a[3]<b[3])   {Ao=true; ao=true;}                                 //两次登录时间里含有周日if(Ao&&ao){SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();editor.putInt("all_score",0);editor.putBoolean("isRefresh1",false);editor.apply();

模拟:第一次到达星期日的时候才会运行,Ao=true,ao=true,运行一次,ao=false,不在运行,那么问题来了,如果七天内曾打开软件,ao=false恒成立,我们就永远无法更新每周任务,所以我们要在每日任务里添加一句话在if(Bo&&bo),那就是

 editor.putBoolean("isRefresh1",true);

有什么用?每天运行了一次每日任务,就把ao=true,而只有周日12:30以后才会执行每周任务(只有这种状态需要ao的改变),这样我们就完美解决了这个问题。好了,关于每日每周自动定时更新就说完了,或许存在时间不精确的问题,但是大概的功能实现了。关于这个软件算是彻底告一段落了,一个月后将会开始新的征程,相信又会有很多新的收获和挑战!

手把手教你写软件8. 每日,每周自动定时任务相关推荐

  1. 手把手教你写一个Matlab App(一)

    对于传统工科的学生用的最多的编程软件应该就是matlab,其集成度高,计算能力强,容易上手,颇受大众青睐.今天挖的这个新坑,主要是分享用matlab app designer设计GUI界面的一些方法和 ...

  2. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

  3. 【CCS仿真系列教程】手把手教你纯软件仿真实现音频滤波

    [CCS仿真系列教程]手把手教你纯软件仿真实现音频滤波 事先说明 示例项目下载 示例使用说明 首先用Matlab生成加了噪声的音频 将我的项目弄你的CCS的WorkSpace中 把Matlab生成后的 ...

  4. 手把手教你写批处理-批处理的介绍

    标题:手把手教你写批处理-批处理的介绍 作者:佚名 编者:Climbing 出处:中国 DOS 联盟之联合 DOS 论坛 题注:willsort 日期:2004-09-21 ------------- ...

  5. 如何去选取第一批要阅读的论文?_【手把手教你写论文】第二期:文献阅读进行时...

    点击蓝字 关注我们 无论是本科阶段.硕士阶段还是博士阶段,甚至是工作后的职称评定,大家可能都面临着论文写作和发表的需求,需要去完成各种形式的论文,比如毕业论文.期刊论文.会议论文等等. 自从2019年 ...

  6. 良匠-手把手教你写NFT抢购软(五)

    良匠-手把手教你写NFT抢购软(五) 前言 本篇文章接上上一篇,如何用易语言去请求刚刚分析的接口. 操作 打开上次做的模板,和精易编程助手,先导入精易模块,再复制代码进去. 点击精易编程助手上面的生成 ...

  7. 良匠-手把手教你写NFT抢购软(二)

    良匠-手把手教你写NFT抢购软(二) 本篇教大家安装使用常用的NFT抢购所需软件 1.软件介绍 易语言 Fildder 精易编程助手 精易模块 软件链接 https://wws.lanzouy.com ...

  8. 良匠-手把手教你写NFT抢购软(一)

    良匠-手把手教你写NFT抢购软(一) 抢购软件原理 查看和分析HTTP请求 常见HTTP请求 合集: 博客地址 抢购软件原理 我们在点击抢购按钮的时候,会向平台的服务器发送HTTP请求,这条HTTP请 ...

  9. 【转载文章】手把手教你写批处理______附加我的读书笔记

    https://www.w3cschool.cn/dosmlxxsc1/uebwv9.html 手把手教你写批处理 由 ✎﹏๓₯㎕ζั͡❦﹏﹏♛ 创建, 最后一次修改 2015-11-06 手把手教你 ...

最新文章

  1. vs2015 python 调试dll
  2. 现代控制理论输出y_现代控制理论试题及答案
  3. mysql可以存储标点么_MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》...
  4. mybitys 动态sql 注释_mybatis注解动态sql详解
  5. 使用 Cake 推送 NuGet 包到 AzureDevops 的 Artifacts 上
  6. python中spark有什么功能_Spark SQL是什么,提供的主要功能有哪三种?
  7. MySql主从同步最小配置
  8. idea查看一个类的所有子类_java new一个对象的过程中发生了什么
  9. 安装vue-cli脚手架
  10. python plt 批量修改全局样式
  11. 三维点云配准方法(两帧)
  12. 苹果应用ipa安装包下载
  13. rsyslog,journalctl
  14. termios结构体各成员
  15. Ubuntu 修改鼠标中键功能
  16. 十张数据图回顾雾霾,北京污染从南向北加深趋势明显
  17. Linux的编辑器、编译器、配置文件、及其安装方法的理解
  18. 现代存储架构:磁带存储在数据中心重生
  19. 灰色系统学习总结(一)
  20. es根据字段长度过滤_es根据字段长度过滤_如何进行elasticsearch查询以过滤字段的最大值?...

热门文章

  1. EditPlus注册码
  2. 重启服务器后mysql表损坏 Incorrect key file for table ‘.\axxxx.MYI‘; try to repair it“,“tourl“:““,.....
  3. Jest 单元测试 enzyme 报错信息:When using mount: Cannot read prop
  4. 中国区块链50城之香港:新政之下STO或成热点 | 链塔智库
  5. BigTable读后感
  6. 页面滚动到某一位置吸顶_前端吸顶功能,滚动到一定位置时固定到顶部
  7. view的生命周期(实训)
  8. 全球最大乐高乐园度假区落户深圳;全球最大最高观景摩天轮将开业 | 美通社头条...
  9. 详解Flink中的状态管理
  10. 网上 软件各种版本的定义和解释Beta、RC、Release