一种图片加载方法及装置制造方法及图纸

技术编号:15878620 阅读:44 留言:0更新日期:2017-07-25 16:36
本申请公开了一种图片加载方法及装置,可将解码所得的图片数据缓存在本机堆内存,即Native堆内存中,以便图片加载时复用,这样,由于Native堆内存不计算在应用进程的Java堆内存内,因而可有效降低Java堆内存的压力,降低OOM的触发概率,同时,还可达到更好地利用堆内存实现图片缓存,以提高图片加载效率并减少系统GC的效果。

Picture loading method and device

The invention discloses a device and a method for loading pictures, pictures can be decoded data cache the heap memory in the machine, namely Native heap memory, so that the image loading time multiplexing, such as Native, heap memory is not included in the application process of Java heap memory, which can effectively reduce the Java heap memory pressure and reduce the probability of triggering OOM, at the same time, also can achieve better use of heap memory to achieve image cache, in order to improve the efficiency and reduce the image loading system GC effect.

【技术实现步骤摘要】
一种图片加载方法及装置
本申请涉及图片处理
,尤其涉及一种图片加载方法及装置。
技术介绍
对于安卓设备来说,在进行图片加载时,由于解码图片需要占用应用进程大量的Java堆内存,且,安卓系统的应用进程都有一定大小限制,因而当应用进程的Java堆内存使用率较高时,极易出现堆内存不足的现象,从而触发OOM(OutOfMemory,内存耗尽)。为了解决这一问题,目前可采用图片缓存的方式来减少图片解码,以实现对解码所得图片数据的复用,进而降低Java堆内存的使用率。例如,在从网络或本地资源解码出Bitmap(位图)对象后,可通过使用LinkedHashMap(基于链表、哈希实现的Map数据结构)实现LRU(LeastRecentlyUsed,近期最少使用算法)缓存管理,即,将最近使用到的Bitmap对象用强引用保存起来(保存到LinkedHashMap中),当缓存数量达到预定值的时候,将不经常使用的Bitmap对象删除,从而实现对Bitmap对象的复用,提高用户的应用体验。但是,由于在采用现有的图片缓存方式来实现解码所得图片数据的复用时,仍是在Java层解码出Bitmap对象,并将解码所得的Bitmap对象缓存在Java堆内存,即,缓存的图片数据所占用的内存仍为Java堆内存,从而导致Java堆内存的压力仍较大,在进行图片的解码时,仍极易出现堆内存不足的现象,从而触发OOM。
技术实现思路
本申请实施例提供了一种图片加载方法及装置,用以解决采用现有的图片缓存方式来实现解码所得图片数据的复用时,由于Java堆内存的压力仍较大从而极易触发OOM的问题。一方面,本申请实施例提供了一种图片加载方法,包括:在对图片进行加载时,判断Native堆内存中是否缓存有该图片的解码数据;若是,则从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载;若否,则从存储有该图片的存储空间处获取并加载该图片,并将加载该图片的过程中所得到的该图片的解码数据缓存到Native堆内存中。另一方面,本申请实施例提供了一种图片加载装置,包括:判断单元,用于在对图片进行加载时,判断Native堆内存中是否缓存有该图片的解码数据;执行单元,用于若确定Native堆内存中缓存有该图片的解码数据,则从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载;否则,从存储有该图片的存储空间处获取并加载该图片,并将加载该图片的过程中所得到的该图片的解码数据缓存到Native堆内存中。本申请有益效果如下:本申请实施例提供了一种图片加载方法及装置,可将解码所得的图片数据缓存在本机堆内存,即Native堆内存中,以便图片加载时复用,这样,由于Native堆内存不计算在应用进程的Java堆内存内,因而可有效降低Java堆内存的压力,降低OOM的触发概率,同时,还可达到更好地利用堆内存实现图片缓存,以提高图片加载效率并减少系统垃圾回收,即系统GC的效果。附图说明为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1所示为本申请实施例一提供的图片加载方法的一种可能的流程示意图;图2所示为本申请实施例一提供的图片加载方法的另一种可能的流程示意图;图3所示为本申请实施例二提供的图片加载装置的一种可能的结构示意图。具体实施方式由于对于Android系统来说,堆内存可分为Java堆内存和Native堆内存,且,Native堆内存是不计算在Java堆内存内的,因而,在本申请所述实施例中,可基于这一点将解码所得的图片数据缓存在Native堆内存中,以便图片加载时复用,这样,由于Native堆内存不计算在应用进程的Java堆内存内,因而可有效降低进程的堆内存压力,降低OOM的触发概率,同时,还可达到更好地利用堆内存实现图片缓存,即更好地实现图片解码数据的复用的效果,以提高图片加载效率并减少系统GC,进而提升系统性能。为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。实施例一:本申请实施例一提供了一种图片加载方法,所述图片加载方法可适用于任何基于Android系统的客户端或终端设备,对此不作限定。具体地,如图1所示,所述图片加载方法可包括以下步骤:步骤101:在对图片进行加载时,判断Native堆内存中是否缓存有该图片的解码数据,若判断结果为是,则执行步骤102,否则,执行步骤103。可选地,图片的解码数据通常为对该图片进行解码所得到的Bitmap对象的像素数组数据。另外,由于在本申请所述实施例中,针对任一图片,当将该图片的解码数据缓存到Native堆内存中时,通常会在NativeCacheInfo(本机堆内存缓存记录信息)中生成一对应的记录数据,因而,判断Native堆内存中是否缓存有该图片的解码数据,可执行为:判断是否能够从NativeCacheInfo中,获取到与该图片的解码数据相对应的记录数据,若判断结果为是,则确定Native堆内存中缓存有该图片的解码数据,否则,则确定Native堆内存中未缓存有该图片的解码数据。其中,所述NativeCacheInfo中的每一记录数据可包括与该记录数据相对应的图片的宽、高、NativePointer(本机堆内存指针,用于指明该记录数据所对应的解码数据在Native堆内存中的存储地址)、Bitmap.Config(用于指明图片的每个像素所占用的内存大小)、解码数据的数据长度等属性信息。另外,为了便于查找与记录,每一记录数据通常可通过能够唯一标识该记录数据对应的图片的标识信息(或能够唯一标识该记录数据对应的图片的解码数据的标识信息)进行标记,对此不作赘述。再有,由于NativeCacheInfo所占用的内存通常较小,因而,可将NativeCacheInfo存储于Java堆内存中(当然,为了进一步降低Java堆内存的存储压力,还可将NativeCacheInfo存储于Native堆内存中);并且,可采用LRU对NativeCacheInfo中的各记录数据进行管理,以便达到对NativeCacheInfo中的各记录数据以及堆内存中的图片缓存数据进行实时维护,在对应淘汰相应的记录数据时将Native堆内存中的相应解码数据所占用的内存同步释放,以进一步降低堆内存压力,减少OOM概率的效果。另外,需要说明的是,在本申请所述实施例中,还可通过其它方式来判断Native堆内存中是否缓存有该图片的解码数据,如,通过对Native堆内存中缓存的数据进行逐条扫描的方式,来判断Native堆内存中是否缓存有该图片的解码数据,对此不作限定。步骤102:从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载。可选地,如图2所示,步骤102所述的从Native堆内存中获取该图片的解码数本文档来自技高网...
一种图片加载方法及装置

【技术保护点】
一种图片加载方法,其特征在于,包括:在对图片进行加载时,判断本机堆内存Native堆内存中是否缓存有该图片的解码数据;若是,则从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载;若否,则从存储有该图片的存储空间处获取并加载该图片,并将加载该图片的过程中所得到的该图片的解码数据缓存到Native堆内存中。

【技术特征摘要】
1.一种图片加载方法,其特征在于,包括:在对图片进行加载时,判断本机堆内存Native堆内存中是否缓存有该图片的解码数据;若是,则从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载;若否,则从存储有该图片的存储空间处获取并加载该图片,并将加载该图片的过程中所得到的该图片的解码数据缓存到Native堆内存中。2.如权利要求1所述的方法,其特征在于,判断Native堆内存中是否缓存有该图片的解码数据,包括:判断是否能够从本机堆内存缓存记录信息中,获取到与该图片的解码数据相对应的记录数据,若判断结果为是,则确定Native堆内存中缓存有该图片的解码数据。3.如权利要求1或2所述的方法,其特征在于,在判定Native堆内存中缓存的该图片的解码数据有效时,则从Native堆内存中获取该图片的解码数据。4.如权利要求3所述的方法,其特征在于,判断Native堆内存中缓存的该图片的解码数据是否有效,包括:判断本机堆内存缓存记录信息中的、与该图片的解码数据相对应的记录数据中的本机堆内存指针是否为有效指针,若判断结果为是,则确定Native堆内存中缓存的该图片的解码数据有效;其中,所述本机堆内存缓存记录信息中的每一记录数据中的本机堆内存指针用于指明该记录数据所对应的解码数据在Native堆内存中的存储地址。5.如权利要求2所述的方法,其特征在于,所述本机堆内存缓存记录信息位于Java堆内存中,且,所述本机堆内存缓存记录信息中的各记录数据采用近期最少使用算法LRU进行管理。6.如权利要求1或2所述的方法,其特征在于,该图片的解码数据为对该图片进行解码所得到的位图Bitmap对象的像素数组数据;从Native堆内存中获取该图片的解码数据,并基于获取到的解码数据实现该图片的加载,包括:判断画布ImageView当前显示的Bitmap对象是否满足该图片的解码数据所需的重用条件;若满足,则将Native堆内存中缓存的、对该图片进行解码所得到的Bitmap对象的像素数组数据拷贝到ImageView当前显示的Bitmap对象中,得到新的Bitmap对象,并将新的Bitmap对象渲染到ImageView中,以实现该图片的加载;若不满足,则从位图文件池中获取一符合该图片的解码数据所需的重用条件的Bitmap对象、或者创建一符合该图片的解码数据所需的重用条件的Bitmap对象,并将Native堆内存中缓存的、对该图片进行解码所得到的Bitmap对象的像素数组数据拷贝到获取到的或者创建的Bitmap对象中,得到新的Bitmap对象,并将新的Bitmap对象渲染到ImageView中,以实现该图片的加载;其中,所述位图文件池位于Java堆内存中、且其引用方式为软引用。7.如权利要求6所述的方法,其特征在于,若确定ImageView当前显示的Bitmap对象不满足该图片的解码数据所需的重用条件,则所述方法还包括:将ImageView当前显示的Bitmap对象存放至所...

【专利技术属性】
技术研发人员:李锦敏冯显桂余龙飞王远秋
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:开曼群岛,KY

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1