接触android应用开发的两年来,很少使用到queue队列,也许是需求的原因,很多情况下需要使用队列,都通过数组或者集合通过增删改查解决了。这次在app4.0.5的开发中,有一个需求用到了队列。我首先想到的还是集合或者数组来解决,但一想,不妨用队列来试一试。
现在的大多数app,都会在启动的时候首先展示一副启动图,或者称之为广告页,经过两到三秒,再进入app首页。对于一些大型app来说,这个启动图可以通过静默下载的方式,在一些节日活动或者纪念促销的前夕,悄悄下载保存在本地手机,等到用户在指定的某天打开app时,就会看到最新的启动图。但是对于一些没有静默下载能力的app,就只有选择曲线救国了。本次介绍的启动图预加载就是在没有静默下载的情况下,通过预先多加载一个图片信息,来完成需求。
java队列——LinkedList。实现了Queue接口。下面我们看看Queue interface中的一些抽象方法:
1:peek() 返回header但不移除header,队列的特点就是先进先出。该方法的特点就是当我们想知道队列的头部是何元素时,可以通过该方法返回。
2:element () 返回header但不移除header。它和peek()之间的区别是:
peek()方法调用时,如果队列为empty,那么就会返回null
element()调用时,如果队列为empty,就会抛出异常 NoSuchElementException
3:poll()返回并且移除header。
4:remove()返回并且益处header。它和poll()的却别是:
poll()if this queue is empty,就会return null。
remove() if this queue is empty,就会抛出异常NoSuchElementException
5:add()。插入元素到队列,失败则抛异常
6:offer()。插入元素到队列,失败则返回false。
了解了我们将要使用到queue队列之后,我们就可以看看逻辑是怎么实现的。
首先我们对里面的一些节点做一些解释:
1:清理队列:我们在返回图片信息时,会同时返回图片的其他信息,包括图片指定的显示时间begin,和图片的指定最后显示时间end。当我们在打开app时,首先加载序列化的队列,然后将队列中的图片信息迭代,删除图片指定的最后显示时间end小于system.currentTimeMillis()的。这个时候就可以调用peek()来移除了。
2:显示:当清理完队列之后,isEmpty()返回的是false时,就可以判断队列的header图片信息的begin是否满足了指定显示时间的条件。如果满足就显示,不满足就不显示。
3:加载:因为我们假设的条件是队列长度为2,也就是只预加载一张图片。所以我们在加载之前还要对队列进行判断,当队列的长度小于2时,就调用api加载图片,加载图片完成之后,添加到队列中,并序列化到本地。