接到一个需求,用户下单后,商店这边需要显示在线订单列表,订单十分钟内有效。于是需要设计倒计时,显示每个订单剩余处理时间。
倒计时剩余时间: 订单创建时间 + 10分钟 - 系统当前时间
刷新剩余时间:在ListView的adapter的getView中,根据绑定的order按照上面的公式算出时间并显示
当用户下单后,服务器是通过推送告知商店有新的在线订单,然后商店再去获取最新的在线订单列表。如果在线订单界面来处理收到的推送,每当有新订单的通知,就去请求服务器获取最新列表,这样最简单直接。然后再写个定时器,每秒执行ListView的notifyDataChanged来刷新倒计时,请求到数据时就将就的订单列表clear,设置新的数据。
但是,当其他的位置需要显示在线订单列表数量的时候,怎么处理?并且,直接写在Activity中会导致代码很乱,难以维护。
新的想法是,创建一个独立的计时器,每秒执行任务task,至于需要执行的task只需要实现Task接口,并且注册到task列表中。这样在线订单的Activity只需要实现并注册task,然后把需要的事情写在task函数中就行了。
至于在线订单列表,就用一个全局的管理类来处理,初始化的时候请求一次数据,放到静态的list中,只有收到在线订单的通知或者主动的执行管理类的静态函数needChange(),才会去请求后台的在线订单列表。在线订单Activity只需要调用管理类的getOnlineOrders()就能得到订单列表。
基本上解决了倒计时显示,但是还是隐藏了一个问题,就是计算剩余时间。本来,大多数android设备的时间都是正常了,但是难免有些比较调皮(相差个几年或者几小时之类的)。这样导致了android系统时间和订单创建的时间(服务器时间)有一定的差距,影响了计算剩余时间公式的准确性。
解决时间不准确的思路时,刚开始想直接修改系统时间,但是想想,看有没有另外的方法。后来和后台商量,提供一个校准时间的接口,返回服务器当前时间。如果每秒都访问,这样设备过多时有点给服务器压力了。设置一个计数器,当过了多少秒就请求一次,比如100或者1000之类的。另外当android系统时间与服务器时间差距在1s的时候,就选择系统时间。(如果系统时间准确,或许可以将校准时间的频率再低点)
以上就是关于倒计时的思路了