基础应用框架之Image Pool

本章介础应用框架Image PoolImage Pool提供了服解决方案。通控制内存使用量;减少;Android View的无缝结等,提供的最佳

 

1.1                     特性 Feature

1.1.1                      内存管理

Android片是一个Bitmap象,而该对象保存片数据的内存是在Native的。因此只是依靠Java自身的垃圾收集机制是不的,使用容易引起OOM。基于引用LRU机制的内存和Cache管理,既可以保片所占内存低于置的上限,又能利用可用内存提供的用--减少用的流量消耗和等待时间

 

1.1.2             多策略的

当图片对象被替换出内存时,会被放在本地的cache中,以减少不必要的流量。缓存具有不同的类型,以适应不同的业务需要,如:

·        本地永久存储,在未达到上限前,不自动删除的本地文件系统缓存。应用负责删除

·        应用程序为生命周期,退出后清除

 

1.1.3             片代理

Android中的片的示是以一个Drawable的形式通viewsetDrawable或者setBackgroudDrawable方式在是屏幕上的。而服端下片有不同的状:未下,在Cache中,在内存中等。里我使用了代理模式,Image Pool管理的是Drawable的一个代理Drawable Proxy. 态对使用者透明,而它本身又是一个Drawable象。这种方式和自定Imageview相比,更自然灵活。

 

 

1.1.4             片分管理和

开发中遇到的,很多适合是的形式来操作,比如:店的一展示;某宝的一组详方式,生命周期是完全相同的。

Image Pool基于的形式的加。同的,而按不同的策略来决定。使用者可以比较简单灵活的控制加,保证优当前期望先看到的片。一个典型的例子是,宝搜索的一般是以List的形式分展示的,用List上快速的滑动过程中,希望看到当前屏幕中的宝对应Group度可以保当前中的片。

 

1.1.5             定制的图选择策略

同一片,器端一般有一套不同尺寸的高清,准,低彩等级别于不同屏幕大小的手机和不同弱的网合体和流量的因素,选择不同量的片。比如:在wifi选择质高的片,而在移向于流量的

Image Pool中的策略机制,使得选择对应开发透明。只需要制定一次策略所有的就都适用了。

 

1.1.6             格式 -webp

Webp图片压缩格式相比同样大小的JPEGPNG压缩格式。在不损失质量的前提下,图片大小有20%的减小。淘宝的图片服务器,已经全面支持webp格式。而Image Pool通过自定义图片格式支持和图片选择策略结合,只需要几行代码就能在应用程序中集成Webp的支持。

 

1.2                     快速入 Getting Start

Image Pool使用的快速入。介使用Image Pool的必要步骤和典型用法。

1.2.1             初始化

Image Pool功能使用起来前,需要做一些初始化工作。

/**

 * 初始化,需要保在使用功能前被

 * @paramcontext context

 * @paramuserAgent 片下载时使用的Agent

 * @parampicPattern 片的Pattern片地址必含有Pattern中的字符串才认为是有效,"http"匹配到URL

 */

public synchronized void Init(Applicationcontext, String userAgent , String picPattern)

 

 

Sample code

ImagePool.getInstance().Init(context,"taobao_android","taobao");

 

SdkEntry提供SDK所有模一初始化入口,如果使用SdkEntry可跳过这

 

1.2.2             初始化可用内存上限

Image Pool的内存上限,缺省2M

/** 置管理片的占用内存上限,置是立即生效的

 * @paramsize 内存上限,位是字

 */

public void setMaxMemory(int size)

 

2M是一个比保守的置,内存上限的应该充分利用手机中用可得的内存源。按我经验内存占可用内存的1/3左右。SDKUtil包中的MemoryManager提供了一个个内存的方案。

/**

 * 程内存信息

 *

 *

 * @return  如果找到程,返回程内存信息,返回null

*/

public ProcessMemoryInfo getMemoryInfo()

 

 

public class ProcessMemoryInfo {

        intmem_dalvik;

        intmem_native;

        intmem_max;

        intmem_limit; //dalvik能分到的最大内存

        ......

}  

mem_limit是一个Application所能的内存上限。当然也有适配问题,在某些手机上不一定能,或者不一定准确,因此需要限定上,下的极限

 

1.2.3             自定义图片下策略

在不同的网络环境下,对于不同屏幕大小的设备,选择合适的图片。可以节省图片流量。图片质量分为三种模式,供用户选择:

·        低彩模式 - 节省流量优先

·        高清模式 - 图片质量优先

·        智能模式 - Wifi下,等同于高清模式;在2G/3G下等同于低彩模式

 

TODO:插入图片

Figure 1 -  置接口

 

Image Pool支持自定策略需要提供一个实现IImageQualityStrategy  接口的策略实现者。

 

/**

 * 个接口定选择策略

 * 于不同的分辨率的手机和不同的网,一灵活的选择策略,根据些条件动态

 * 在流量和用上平衡。而对应开发者来,只要提供基准片就可以,不需要实现细节

*/

 

public interface IImageQualityStrategy {

   

    /*

     * 以下是策略的常量定

     */

   

     /**

     * 不采用策略

     */ 

    publicstatic int STRATEGY_MODE_OFF = 0;

 

     /**

     * 智能模式

     */ 

 

    publicstatic int STRATEGY_MODE_SMART = 1;

   

     /**

     * 低彩模式

     */ 

    publicstatic int STRATEGY_MODE_LOW = 2; //低彩模式

    /**

     * 高清模式

     */ 

    publicstatic int STRATEGY_MODE_HIGH = 3; //高清模式

     /** 根据当的状决定最片地址

     *@param originUrl 入的片地址    

     *@return 片地址

     */

    publicString decideUrl( String originUrl );

   

     /** 提取URL中的基url信息,用于在FileCache中做匹配        

     * @param originUrl 入的片地址    

     *@return 片地址

     */

    publicString getBaseUrl(String originUrl );

   

     /** 在从Cache中加载时选择cache片的策略

     *@param originPath 入的片在Cache的地址

     *@param files 以基URL和匹配规则Cache中匹配到的列表,在个列表中选择适合的加         

     *@return Cache中下片的路径

     */ 

    publicString decideStoragePath(String originPath, String [] files);

   

     

   

     /** 置策略模式

     *@param mode 策略模式

     */     

    publicvoid setStrategyMode( int mode );   

   

     /** 返回当前的策略模式

     *@return 策略模式

     */ 

    publicint getStrategyMode();

       

   

}

 

在初始化需要用的片策略实现

IImageQualityStrategy s =  new TBImageQuailtyStrategy(contexscreen_width,screen_height);//化策略实现

s.setStrategyMode(savedStrategyMode); //当前用户选择的策略,给实现

ImagePool.instance().setImageQualityStrategy( s); //把策略Image Pool

 

1.2.4             退出时的资源释放

退出用或者到后台,需要Image Pool所占的源。Image Pool提供的两个函数分用于种场景。

     /* 线,放文件存句柄

     * 注:一旦束,度工作不会再行,将无法下载图片。

     */

    publicsynchronized final void release();

   

   

    /**

     * 放文件存句柄

     */

   

NOTE:    再次到前台,需要先重新Init

 

 

1.2.5             Group简单场

组图是在同一Activity中,而随着Activity于生命周期的不同状的状也随着

于相同个数一一对应的的一View和一组图片的景,使用ImageGroupAdvImp是最简单的。首先,生成Group候,指定对应关系,和自定定、解操作。

mImageGroup = newImageGroupAdvImp("GuarantLabelLayout", imgUrls, imgViewList,

            new  MyImageBinder(), context,ImageGroup.PRIORITY_NORMAL, ImageCache.CACHE_CATEGORY_MRU);

mImageGroup.start();

 

其中MyImageBinder是一个实现ImageBinder接口的例,它实现片和View定和解操作。

/**

 *ImageBinder

 * 实现绑定的接口定

 * */

public interface ImageBinder

{

    /**

     * bindImg2View

     * Drawable置到view

     * @param d Drawable

     * @param view 定的控件

     * @return 是否定成功

     * */

    publicboolean bindImg2View( Drawable d, View view);

   

    /**

     * unbind

     * DestroyView的操作

     * @param view 定的控件

     * @return 是否解成功

     * */

    publicboolean unbind(View view);

   

}

 

其次,和任何Group,在ActivityonStop操作中,用:

public void onStop() {

   if(mImgGroup != null){

       mImgGroup.pause();

    }

}

注:不在onPause操作中用的原因是,此ViewonDraw可能被用,而在onStopview上的片就不会被使用了,这时可以把片的状态设为可回收。

 

ActivityonResume操作中,

public void onResume() {

   if(mImgGroup != null){

        mImgGroup.resume();

   }

}

 

ActivityonDestroy操作中,

public void onDestroy() {

   if(mImgGroup != null){

        mImgGroup.onDestroy();

                                 mImgGroup =null;

                                 

    }

}

NOTE:    三个生命周期相的函数式定ImageGroup接口中的,意味着所有Group都需要实现

1.2.6             Group的常见场

比起一一对应景,更常的是View片少很多,View是被片所用的。例如在List View中,界面上示的View是固定的,而随着List View的滑,不同的定到对应view上。 DataLogic中有适合这种场景的Group实现Image PoolData Logic合是景的最佳解决方案

具体如何在此种场景下使用Data LogicData Logic

1.2.7             单个图片加载

只有一张图片需要加这时需要看这张图片是否需要Image Pool来帮助管理内存,如果需要,使用一个只包含这张图Group。如果不需要,不使用Image Pool。一个典型的例子是,登陆时验证图片,在景下同一个URL对应不同的片,Image Pool就不适合在里使用了。建使ApiRequestMgr提供的DownloadImage方法,并自己管理片的内存。

 

1.2.8             图片的转换

需要的片是在下下来的片上做一些理,比如做角。而片才是Image Pool管理的片。在这张场景下,可以在从ImagePool提供一个转换操作。转换操作在入的原上做操作并返回转换后的片,由Image Pool管理起来。

义转换操作的接口是:

/** BitmapConvertor转换的接口    

 * ImageHandler可以提供一个转换方法(如做角),来改ImageHandler

 * 管理的Bitmap

 */

public interface BitmapConvertor

{  

    /**从原先的Bitmap转换为新的Bitmap 

     * @param origianl 老的Bitmap

     * @return 转换后的Bitmap

     */

    publicBitmap convertTo(Bitmap original);      

}

使用带转换操作的方法片的代

Drawable drawable =ih.getDrawable(new RoundIconConvertor());

public static classRoundIconConvertor implements BitmapConvertor {

    //.......

}

 

1.3                     最佳 Best Practice

节总结了在淘宝主客端中使用Image Pool的一些经验和思路

1.3.1             如何实现策略选择

Android设备,屏幕分辨率从小到大差很大。同一张图片在不同的设备上最合适的尺寸是不同的。另一个因素是,不同的网络环境下流量和体的取舍。比如Wifi下体验优于流量的考,而2G/3G相反

淘宝的CDN片服器,同一片有一不同尺寸:

24,30,40,60,64,70,80,90,100,110,120,128,160,170,250,310,430,670

在淘宝主客端中我按屏幕大小分小(480以下),中(480640),大(640以上)三。界面的开发者不必考三套,他只需要按照480设备来决定原始片尺寸。策略实现中会考虑设备大小和网因素决定真正使用的片尺寸

NOTE:    片策略的实现者不属于SDK的部分,在Ref下有源参考实现

 

 

1.3.2             如何支持webp格式图片

Webp格式比相同大小的PNGJPG格式要小,如果片服器支持 - 淘宝片服器已全面支持webp格式 - 流量的减少有非常著的效。ImagePool管理了所有片的下,且策略机制让应用可以决定实际片。因此支持Webp格式只需要:

·        集成webpDecoder

Android 4.0中已有了webp支持;4.0前的手机是占了大部分,在用框架的dep下,提供了一个webp decoder实现libwebp.so

是一个arm格式的文件,加入到工程的assets/so/armeabi下。如所示:


Figure 2 - libwebp.so的位置

 

libwebp是一个语言实现的Native层的库,为了使用它需要一个Java层的BindingWebPBitmapHelper类。Image Pool中,定义了图片解码的扩展机制。应用可以实现IBitmapHelper接口的解码器注册到BitmapHelperFactory类。这样Image Pool就会根据后缀名和文件内容找到合适的解码器了。

 

IBitmapHelper接口:

/** BitmapHelperFactory用于支持可展的片格式的解

 * IBitmapHelper了用于解压图片的BitmapHelper的接口

 * */

public interface IBitmapHelper

{

    /**

     *  予数据流和文件URL,判断是否支持

     * @param  b  数据流

     * @param url 文件URL

     * @return 是否支持片文件的解

     * */

    booleanisSupport( byte[] b , String url);

   

    /**

     *  予数据流和文件URL,返回解出来的Bitamp

     *  @param  b  数据流

     * @param url 文件URL

     * @return 出来的Bitamp,失返回Null

     * */

    BitmapBytes2Bimap(byte[] b, String url);

   

}

 

注册解码器:

BitmapHelperFactory. registerHelper( new WebpBitmapHelperImp());

NOTE:     WebpBitmapHelperImpWebPBitmapHelper不属于Image PoolSDK,但在包中提供源代实现参考。

 

·        在策略机制建立到webp格式片的映像

以淘宝的CDN例,jpg/pngwebp的映像系如:

http://q.i01.wimg.taobao.com/bao/uploaded/i1/T1TVLAXeBhXXXM8XM9_102307.jpg_100x100.jpg

http://q.i01.wimg.taobao.com/bao/uploaded/i1/T1TVLAXeBhXXXM8XM9_102307.jpg_100x100.jpg_.webp

即在JPG/PNGURL地址上增加后_.webp

 

1.3.3             扩展图片加载机制

Image Pool最初是管理服-即通HTTP片。它的特点,加需要比大的时间开销了尽量避免重新加开销一般在客端需要有内存和文件的Cache。在开发程中,遇到一些其他型的片有相同的特征。比如手机上用程序的Logo片。Image Pool过扩协议的方式,用一的方式来管理不同加方式的片。比如Logo片,定了如下协议格式:

package://PackageName 


你可能感兴趣的:(cache,bitmap,imageview,应用程序)