安卓电视快速切换高清图的方法、存储介质、设备及系统与流程

文档序号:16633044发布日期:2019-01-16 06:45阅读:321来源:国知局
安卓电视快速切换高清图的方法、存储介质、设备及系统与流程

本发明涉及安卓电视应用领域,具体涉及一种安卓电视快速切换高清图的方法、存储介质、设备及系统。



背景技术:

人体工程学统计得出,正常人的手指点击按键的频率最快为0.02s(20ms),如果加上信号传递与处理会有超过5ms的延迟,也就意味着在app交互过程中页面响应延迟时间不能超过25ms,这25ms就是mrd(minimumresponedelay,最小响应延时)。

mrd要求在实际app交互过程中图像切换的延迟不得超过25ms,如果加上60ms的帧率,则整个图像切换的最小耗时不得超过85ms,而在app开发过程中位图(bitmap)由于内存占用高,其加载时间比起文字要更为耗时,也就造成现有app经常出现的“先显示文字后显示图片”的现象。目前,解决这个问题的方式大多以下几点:

(1)压缩图片原始大小,降低图片字节流加载解析耗时,但该方式存在图片质量降低的问题;

(2)使用新的图片编码与解编码格式,例如webp格式,其在保证图片质量的前提下,降低了图片的大小,但webp有google提出,目前并未大面积普及,可靠性不稳定;

(3)使用图片加载框架在图片本地缓存过程中进行原始字节码的压缩,待加载进内存后再进行bitmap的解码与质量恢复,该方式是目前快速加载大图的主流方式。其中较为知名图片加载框架有google官方的glide、facebook的fresco等,其中glide善于大量图片的滚动批量平滑加载,而fresco善于资源优化。

在安卓电视领域,由于人机交互方式依赖于遥控器进行,因此不可能像移动手机端那样依赖触摸模式进行滑动可控的方式进行高清图片的快速加载,移动手机的高清快速是渐进式的且可对图片字节码的压入进行阀值控制,但电视端不行,因此采用上述三种方式都无法满足安卓电视领域的高清图快速加载。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种能在安卓电视领域实现高清图快速加载的安卓电视快速切换高清图的方法。

为达到以上目的,本发明采取的技术方案是:

一种安卓电视快速切换高清图的方法,该方法包括以下步骤:

s1.使用图片加载框架从服务器加载图片,将图片字节码缓存在本地缓存目录下;

s2.计算并设置内存缓存的缓存容量,并将图片字节流缓存在内存缓存中;

s3.图片加载框架在内存中解析图片字节流并生成位图文件;

s4.利用缓存容器在内存中缓存位图文件;以及

s5.使当前可视图片切换至与之相邻的位图文件,imageview直接读取相邻的位图文件,完成切换。

在上述技术方案的基础上,所述步骤s1还包括防止图片回滚切换造成图片重复加载的步骤,其具体包括以下步骤:

使用图片加载框架从服务器加载图片后,对每张图片生成加载标记;

当需要再次加载图片时,读取加载图片的url,构建请求加载服务器图片的request,并计算request的哈希值;

遍历本地缓存目录下的图片字节码,读取缓存的图片字节码对应的首选项文件中的标记集合;

使用哈希查找算法对标记集合进行线性探测,若有图片字节码匹配加载图片request的哈希值,则直接读取对应的本地缓存中保存的图片字节码,如果没有匹配的图片字节码,则访问服务器加载数据库图片资源。

在上述技术方案的基础上,所述步骤s5还包括防止切换图片失败导致的图片区域显示异常的步骤,其具体包括以下步骤:

增设预缓存机制,在预缓存中内置计时器并设置计时时间;

释放按键事件;

imageview读取缓存容器中的缓存,判断计时完成后缓存容器中是否缓存有位图文件,若是,返回缓存的位图文件给imageview,若否,则截断按键事件,进行缓存重试,直至缓存容器中缓存有位图文件,imageview重新读取缓存容器中的位图文件。

在上述技术方案的基础上,所述图片加载框架为glide。

在上述技术方案的基础上,根据lru算法计算内存缓存的缓存容量,计算公式如下:

clru=core*2+1(1)

若count<clru,elru=count;若count>clru,elru=clru;

其中,elru为二级缓存动态容量,core为设备cpu核心数,clru为lru算法推荐的缓存容量,count为图片切换计数值,代表的是非循环模式下图片切换的最大切换次数。

在上述技术方案的基础上,步骤s4中,使用arraydeque作为缓存容器在内存中缓存与当前图片相邻的bitmap。

本发明还提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。

本发明还提供一种设备,包括存储器、处理器及存储在存储器上并在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。

本发明还提供一种能在安卓电视领域实现高清图快速加载的安卓电视快速切换高清图的系统。

为达到以上目的,本发明采取的技术方案是:

一种安卓电视快速切换高清图的系统,包括:

加载模块,其用于从服务器加载图片,并将图片字节码缓存在本地缓存目录下;

计算模块,其用于计算并设置内存缓存的缓存容量,并将图片字节流缓存在内存缓存中;

解析模块,其用于在内存中解析图片字节流生成位图文件;以及

缓存容器,其用于在内存中缓存位图文件。

在上述技术方案的基础上,所述加载模块为glide图片加载框架,所述缓存容器为arraydeque。

与现有技术相比,本发明的优点在于:

(1)本发明的安卓电视快速切换高清图的方法,相比常规的高清图片的切换方案依赖于图片加载框架,在图片加载框架的基础上对一级缓存进行了tag标记,防止重复从服务器加载图片,有效加快了一级缓存的读取。

(2)二级缓存的容量设置使用图片切换计数值来进行计算和动态设置,和常规的依赖于cpu核心数设置的固定值的方法相比,二级缓存的建立更为高效性合理。

(3)在imageview读取位图文件前,提前解析图片字节流并生成位图文件,从而在后续imageview读取位图文件时,不用再等待解析图片字节流的过程,加快了图片的加载切换速度。

(4)采用了缓存重试cacheretry机制,防止了切换图片失败导致的图片区域显示异常的问题。

附图说明

图1为本发明实施例中安卓电视快速切换高清图的方法的流程图;

图2为本发明实施例中设备连接框图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例提供一种安卓电视快速切换高清图的方法,该方法包括以下步骤:

s1.使用图片加载框架从服务器加载图片,将图片字节码缓存在本地缓存目录下。

图片本地缓存指的是图片一级缓存,本实施例中图片加载框架为glide,使用glide来加载服务器图片后缓存在本地缓存目录下,一级缓存的本质是图片字节码,即以图片字节码文件方式存储在本地缓存目录下。

为防止图片回滚切换造成图片重复加载的问题,在使用glide加载图片过程中,需要给每张图片加载标记tag,然后每次回滚切回时,如果需要再次加载相同url的图片则直接读取缓存,具体步骤如下:

使用图片加载框架从服务器加载图片后,对每张图片生成加载标记;

当需要再次加载图片时,读取加载图片的url,构建请求加载服务器图片的request,并计算request的哈希值;

遍历本地缓存目录下的图片字节码,读取缓存的图片字节码对应的首选项文件中的标记集合。本实施例中的首选项文件也即sharedpreferences文件,sharedpreferences是一种轻型的数据存储方式,它的本质是基于xml文件存储key-value键值对数据,通常用来存储一些简单的配置信息。

使用哈希查找算法对标记集合进行线性探测,若有图片字节码匹配加载图片request的哈希值,则直接读取对应的本地缓存中保存的图片字节码,如果没有匹配的图片字节码,则访问服务器加载数据库图片资源。

相比常规的高清图片的切换方案依赖于图片加载框架,本实施例在图片加载框架的基础上对一级缓存进行了tag标记,防止重复从服务器加载图片,有效加快了一级缓存的读取。

s2.计算并设置内存缓存的缓存容量,并将图片字节流缓存在内存缓存中。

图片内存缓存就是二级缓存,本实施例采用lru算法构建图片的二级内存缓存,lru(leastrecentlyused,最近最少使用)缓存算法,其为diskcache内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做lru,操作系统会根据哪些数据属于lru而将其移出内存而腾出空间来加载另外的数据。

二级缓存的本质是图片字节流byteinputstream。本实施例在构建内存缓存的缓存容量时使用的是动态容量设置,而非依赖于设备cpu核心数计算法则。如果图片加载过程中图片的切换计数值count小于clru,则以count为缓存容量,如果count大于clru,则以clru为缓存容量大小,其计算公式如下:

clru=core*2+1(1)

若count<clru,elru=count;若count>clru,elru=clru;

其中,elru为二级缓存动态容量,core为设备cpu核心数,clru为lru算法推荐的缓存容量,count为图片切换计数值,代表的是非循环模式下图片切换的最大切换次数。

由于本实施例图片二级缓存的容量设置使用图片切换计数值来进行计算和动态设置,和常规的依赖于cpu核心数设置的固定值的方法相比,二级缓存的建立更为高效性合理。

s3.图片加载框架在内存中解析图片字节流并生成位图文件。

由于二级缓存是内存缓存,在解析内存缓存图片字节流会延缓图片的生成,本实施例在imageview读取位图文件前,提前解析图片字节流并生成位图文件,从而在后续imageview读取位图文件时,不用再等待解析图片字节流的过程,加快了图片的加载切换速度。

s4.利用缓存容器在内存中缓存位图文件。

本实施例中的缓存容器为arraydeque,在二级缓存的基础上使用arraydeque建立三级临界缓存,图片的三级缓存就是图片在当前可见图片的上下或左右的临界缓存,三级临界缓存缓存的是已经解析后生成的位图文件,旨在进一步通过已经解析的图片字节流生成的位图文件来实现图片快速切换。

arraydeque集合是deque接口的实现类,它是一个基于数组的双端队列。一般的队列queue数据结构只能在末尾添加元素,头部取元素,但arraydeque可以头尾双向进行元素添加或删除,因为图片切换涉及到来回切换,那么要求三级缓存能够进行头尾的元素操作,从而arraydeque非常适合头尾双向的元素快速增删和读取操作。

具体的,本实施例中作为缓存容器的arraydeque,缓存容量的大小为3。当操作头元素时,会先删除尾部元素,腾出尾部元素位置,然后缓存容器会迅速从二级缓存中补填充新的元素至尾部;如果是访问尾部元素时,会先删除头部元素,然后迅速从二级缓存中读取并填充新元素至头部,这里的元素指的是生成的位图文件。

s5.使当前可视图片切换至与之相邻的位图文件,imageview直接读取相邻的位图文件,完成切换。

当按下遥控器的左右键或上下键时,当前可视图片会切换至与之相邻的图片,也就是临界图片加载。由于快速切换的时间限制在80ms以内,因此如果出现临界缓存未及时缓存或缓存未及时清空,会出现临界图片加载不成功的问题,因此,本实施例采用预缓存的机制来处理该问题,预缓存会内置80ms的计时器,计时器完成后如果临界缓存还未完成元素缓存,则进行缓存重试cacheretry,并截断按键事件,待元素缓存成功则继续切换图片,具体步骤如下:

增设预缓存机制,在预缓存中内置计时器并设置计时时间;

释放按键事件dispatchkeyevent;

imageview读取缓存容器中的缓存,判断计时完成后缓存容器中是否缓存有位图文件,若是,返回缓存的位图文件给imageview,若否,则截断按键事件,进行缓存重试,直至缓存容器中缓存有位图文件,imageview重新读取缓存容器中的位图文件。

dispatchkeyevent的处理将直接影响后续图片切换的处理,如果dispatchkeyevent被拦截,则按键操作会失效,从而导致图片无法进行正常切换。

综上所述,本发明实施例相比常规的高清图片的切换方案依赖于图片加载框架,在图片加载框架的基础上对一级缓存进行了tag标记,防止重复从服务器加载图片,有效加快了一级缓存的读取。二级缓存的容量设置使用图片切换计数值来进行计算和动态设置,和常规的依赖于cpu核心数设置的固定值的方法相比,二级缓存的建立更为高效性合理。在imageview读取位图文件前,提前解析图片字节流并生成位图文件,从而在后续imageview读取位图文件时,不用再等待解析图片字节流的过程,加快了图片的加载切换速度。采用了缓存重试cacheretry机制,防止了切换图片失败导致的图片区域显示异常的问题。

对应上述的安卓电视快速切换高清图的方法,本发明实施例还提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时可实现上述实施例中的安卓电视快速切换高清图的方法的步骤。需要说明的是,存储介质包括u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

另外,参见图2所示,对应上述的安卓电视快速切换高清图的方法,本发明实施例还提供一种设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行计算机程序时可实现上述实施例中的安卓电视快速切换高清图的方法的步骤。

本发明实施例还提供一种安卓电视快速切换高清图的系统,包括加载模块、计算模块、解析模块和缓存容器。

其中加载模块用于从服务器加载图片,并将图片字节码缓存在本地缓存目录下。本实施例中的加载模块为glide图片加载框架。

计算模块用于计算并设置内存缓存的缓存容量,并将图片字节流缓存在内存缓存中。

解析模块用于在内存中解析图片字节流生成位图文件。

缓存容器用于在内存中缓存位图文件,本实施例中的缓存容器为arraydeque。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1