威尼斯人线上娱乐

HybridKit缓存及流量优化方案,ios编制程序缓存模块

1 12月 , 2019  

IOS编制程序 图片缓存模块设计,ios编程缓存模块

手提式无线电话机客商端为啥会存在下来?并不是被从来的Wap替代掉?因为手提式有线电话机顾客端有Wap无可替代的优势,正是本身较强的猜测工夫。

手提式有线电话机中不可防止的豆蔻梢头环:图片缓存,在软件的全套运营进程中显得愈发关键。

先轻易说一下图片缓存的功用:

狠抓响应速度:因为图片风流罗曼蒂克旦缓存在本地之后,那么地方IO数据的读取,远比互联网中得IO读取效用要高的多。所以能够拉长响应速度

裁减网络流量:一张图片在好几景况下,只加载二次,之后便不会重复加载,减弱了互联网流量。减少流量分明是不得不承认的。介于国内的流量资费这么贵,是自但是然少不了的

增加顾客体验:那些经验并不止存在于相应速度上,还在有些断网情势上。其实小编想说的是。即正是我们的Computer硬盘丢了,我们软件也理应康健的周转下去,更並且仅仅是断网而已。

 

理之当然如此也会带给缺欠:数据同步难点,假若互联网中得数目更新了。那么您再本地看见的数目永恒都以旧数据。其实自个儿以为那么些主题材料是八个谬论。降低了互连网流量,这种收益,远远胜出那叁个旧数据的难题。当然了,特殊的软件依然某些意况(Wifi)大概会供给多少及时刷新。那么就先加载本地数据。然后从网络中加载数据,替换缓存数据就好了。那么些与数量缓存并不冲突。在特殊点,就分时间段过期就好了。譬喻说,下载一张图片,有小时内一蹴而就。纵然超过风华正茂钟头,就觉着失效了。固然慢点,不过自身依旧见到了最新的数据。至于那些方针难题,要依照差异的景况做最合适的准备,在这里不做赘述,假设您风乐趣,大家也足以研商斟酌。

OK,回归正题。说一下大家的缓存模块设计。简单题说,正是把互连网中得地址映射到地方目录呗。简单思维,把互联网地址中得一些特殊字段替换掉就OK了,比方说
“/”替换到“_”就能够实现映射的指标了。可能直接直接分录的场合下保存到地面,就Ok了,不过那样会带给任何的不鲜明的标题(网络地址的尺寸,如若政策制订的不好,会不会晤世缓存错乱的主题素材。长时间缓存无法兑现的题目等等)。笔者的做法是那样的,将互连网地址中得总是,直接跟地面包车型大巴某四个唯意气风发缓存地址创建映射关系。况且连同创设时间保存到数据库中。那样就能够实现上述的有所的缓存效果了。

先放个思路上来,假设急需代码的话。等随后再说。

对了,有一个细节的地点未有说,怎么生花费地唯大器晚成的地址呢?有以下两种方法仿照效法

随手贴上我们的官方网站地址:

应接转发,不过请评释上原版的书文地址

 

HybridKit缓存及流量优化方案

年前,一贯在忙项目上的作业也没时间写些东西,趁今后项目还地处空闲期,写下项目中相遇的优化方案。刚肃清完发热难题,客户就起来反映大家的app超级费流量,领导也特别注重。我们所用的图片服务器是又拍云援助尺寸裁剪,可是裁剪后的积累大小可能不可观。正好又拍云扶助WebP图片格式,何不尝试下啊?

  • 最近的 Android App
    平日会须求互联网相互影响,通过网络获取图片是再经常可是的事了
  • 即使每一次运营的时候都从互连网拉取图片的话,势必会消耗过多流量。在当前的情况下,对于非wifi客商来讲,流量照旧很贵的,一个很耗流量的选择,其客商数量级鲜明要遭遇震慑
  • 特意是,当大家想要重复浏览部分图片时,要是每叁回浏览都急需通过网络获得,流量的荒芜显而易见
  • 据此建议三级缓存攻略,通过网络、本地、内部存款和储蓄器三级缓存图片,来压缩不需要的互连网相互影响,幸免浪费流量

IOS7 Wechat交际圈相册缓存地点

HybridKit缓存及流量优化方案,ios编制程序缓存模块。得越狱 然后找到应用的岗位 然后找缓存文件夹
 

威尼斯人线上娱乐,引致费流量的因由

  • 1.Hybrid基特的UIWebView未有做缓存
  • 2.又拍云裁剪后的蕴藏大小恐怕非常不足可观

图片链接可缓存最多24钟头,不得直接存款和储蓄或缓存图片本人了,帮助

图片链接后的ID地址,不用思量,键接展开格局,点击新窗口张开.图片尺寸,高及宽不用思量(主若是模块大小,在空间主页上,大家能够团结调治卡塔尔(قطر‎,模块背景边框,点击无
最终输入验证码
点击明确,在半空中的左上角,就涌出了你适逢其会制作的图样模块(有希望来得为全深绿,可是不用顾忌,当前现身的图纸为全土褐,不要误感到叉入不成事卡塔尔.你能够拖动模块大小,调节你所预备停放之处.
htt最终必需求在自定义的荒淫无度,点击保存,那样
那张图片,就交易会示在您的空间主页上啦. 效果演示如下: 作者采用的图形ID地址
图片名称–南朝鲜不错黑白个性动态图片(240×320卡塔尔国 a
href=”.qqbye/gif/UploadFiles_gif/200805/2008052302393182.gif”
rel=nofollow.qqbye/gif/UploadFiles_gif/200805/2008052302393182.gif/a
 

图片缓存模块设计,ios编制程序缓存模块
手提式有线电话机顾客端为啥会存在下来?实际不是被一贯的Wap代替掉?因为手提式有线电话机客商端有Wap无可代替的优…

WebP

WebP(发音
weppy,项目主页),是豆蔻梢头种扶植有损压缩和无损压缩的图样文件格式,派生自图像编码格式
VP8。依据 Google 的测量检验,无损压缩后的 WebP 比 PNG 文件少了 45%
的文件大小,尽管那一个 PNG 文件通过别的压缩工具压缩之后,WebP
照旧得以减少 28% 的文件大小。

二〇〇八 年公告的 WebP 已经不到底特殊事物了,在 谷歌(Google卡塔尔(英语:State of Qatar) 的大咖成品如
Youtube、Gmail、Google Play 中都能够见见 WebP 的身影,而 Chrome
网络商家甚至已全然采纳了 WebP。国外公司如 Twitter、ebay
和国内集团如Tencent、天猫商城、美团等也曾经尝鲜。最近 WebP
也在小编厂相当多的花色中赢得利用,如Tencent快讯客商端、和讯、QQ空间等,同一时候也是有一点针对
WebP 的图片格式调换工具,如 智图,iSparta 等。

  • 网络缓存, 不事情发生以前加载, 速度慢,浪费流量
  • 地面缓存, 次优先加载, 速度快
  • 内部存款和储蓄器缓存, 优先加载, 速度最快

缓存方案

SDWebImage

SDWebImage是iOS开垦者平日使用的三个开源框架,那一个框架的显要职能是:一个异步下载图片並且支持缓存的UIImageView分类。相信各位iOS开辟程序员都不会目生。

  • 第壹次加载 Android App
    时,肯定要通过网络相互作用来赢得图片,之后我们得以将图纸保存至本地PCIe闪存卡和内部存款和储蓄器中
  • 事后运营 App
    时,优先访谈内部存款和储蓄器中的图片缓存,若内存中未有,则加载本地icroSD存款和储蓄卡中的图片
  • 同理可得,只在第大器晚成拜谒新剧情时,才通过网络获取图片能源

WebP集成方法

1.CocoaPods

pod 'SDWebImage/WebP'

2.手动导入

1.工程引入SDWebImage开源库;
2.引入WebP.framework,下载地址:https://github.com/seanooi/iOS-WebP          
3.让SDWebImage支持WebP,设置如下Build Settings -- Preprocessor Macros , add SD_WEBP=1

威尼斯人线上娱乐 1

NSURLCache

  • NSUWranglerLCache 为使用的 UKoleosL
    哀告提供了内部存款和储蓄器甚至磁盘上的归结缓存机制,作为根基类库 URAV4L
    加载的意气风发有个别,任何通过 NSU奇骏LConnection 加载的央求都将被 NSUEnclaveLCache
    管理。
  • 网络缓存减少了亟待向服务器发送必要的次数,同时也升格了离线或在低速网络中使用使用的体会。
  • 当二个呼吁完结下载来自服务器的答应,一个缓存的答复将要本地保存。下一回同二个呼吁再发起时,本地保存的应对就能马上回到,无需连接服务器。NSU智跑LCache
    会 自动 且 透明 地重返回应。
  • 为了理想利用 NSU路虎极光LCache,你须求早先化并安装贰个分享的 U奔驰M级L 缓存。在
    iOS 中那项专门的学业急需在 -application:didFinishLaunchingWithOptions:
    完结

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
                                                       diskCapacity:20 * 1024 * 1024
                                                           diskPath:nil];
  [NSURLCache setSharedURLCache:URLCache];
}
  • 通过new MyBitmapUtils().display(ImageView ivPic, String url)
    提要求外界方法开展图纸缓存的接口
  • 参数含义:ivPic 用于体现图片的ImageView,url 获取图片的互联网地址

NSURLProtocol

NSUEvoqueLProtocol能够阻碍监听每一个UPRADOL Loading
System中发出request乞请,记住是U奥迪Q7L Loading
System中这个类发生的伸手,也支撑AFNetwoking,UIWebView发出的request。假若不是那些类发生的央浼,NSU冠道LProtocol就不能够堵住和监听了。

于是采用NSU景逸SUVLProtocol而不选用NSU牧马人LCache的来由是:NSUSportageLProtocol能够拦截UIWebView发出的图形央求,假诺检验届时又拍云图片链接,会把央浼图片地址改变为WebP格式并利用SDWebImageDownloader来进行图片加载,这是NSUPRADOLCache不可能促成的。

实现

1.在AppDelegate的-application:didFinishLaunchingWithOptions:方法中举办登记,那样NSUENCORELProtocol才会平常专业。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [BFNSURLProtocol registerClass:[BFNSURLProtocol class]];

     return YES;
}

2.WebView 图形哀告替换

webkit内核今后都不扶助深入解析WebP格式的图形,这里主要运用的iOS系统的NSUHighlanderLProtocol来替换其互联网央求(不打听NSU奥迪Q5LProtocol,能够动动本人努力的小手谷歌(Google卡塔尔(英语:State of Qatar)一下),再将互联网回包数据开展转码成jpg大概png(为了发光度),再再次来到给webview举办渲染的。

除此以外,NSUPAJEROLProtocol会拦截全局的网络流量,为防止失误伤害,这里须求单独识别是或不是是WebView发起的恳求,能够通过识别request中的UA是或不是含有”AppleWebKit”来贯彻。

@implementation BFNSURLProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    // 屏蔽非又拍云地址
    if ([[request.URL absoluteString] rangeOfString:@"upaiyun"].location == NSNotFound) {
        return NO;
    }
    //只处理http和https请求
    NSString *scheme = [[request URL] scheme];
    if (([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)) {
        //看看是否已经处理过了,防止无限循环
        if ([NSURLProtocol propertyForKey:URLProtocolHandledKey inRequest:request]) {
            return NO;
        }

        NSString *agent = [request valueForHTTPHeaderField:@"User-Agent"];
        // 只过滤UIWebview里边的加载图片请求
        if ([agent rangeOfString:@"AppleWebKit"].location != NSNotFound && [request.URL isImageURL]) {
            return YES;
        }
    }
    return NO;
}

敲黑板,划重视了!划注重了!划重视了!(首要的专业说三回)

此处能够接管全体WebView中必要替换的图片U福特ExplorerL。

下边,会活动调用startLoading方法,利用SDWebImageManager来加载WebP图片,不仅可以促成WebP的省流量功效,还是能将图片缓存在该地,后一次加载同风流罗曼蒂克图片地址的时候又达到了省流量的指标。耶!~

- (void)startLoading {
    NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
    //标示改request已经处理过了,防止无限循环
    [NSURLProtocol setProperty:@YES forKey:URLProtocolHandledKey inRequest:mutableReqeust];
    NSString *URLString = [self.request.URL absoluteString];

    // 重定义请求地址 将format为jpg改为webp格式
    if ([URLString rangeOfString:@"format"].location == NSNotFound) {
        URLString = [[BFWebImageHelper imageStringToURL:URLString width:0 height:0] absoluteString];
    }
    else if ([URLString rangeOfString:@"format/jpg"].location != NSNotFound) {
        URLString = [[BFWebImageHelper imageStringToURL:URLString width:0 height:0] absoluteString];
    }
    else {
        self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
        return;
    }

    NSURL *url = [NSURL URLWithString:URLString];

    [[SDWebImageManager sharedManager] downloadImageWithURL:url
                                                    options:SDWebImageAllowInvalidSSLCertificates
                                                   progress:nil
                                                  completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                                                      NSData *data;
                                                      // 是否以png结尾
                                                      if ([imageURL.absoluteString.lowercaseString hasSuffix:@".png"]) {
                                                          data = UIImagePNGRepresentation(image);
                                                      } else {
                                                          data = UIImageJPEGRepresentation(image, 1);
                                                      }
                                                      if (!self.client) {
                                                          return ;
                                                      }
                                                      [self.client URLProtocol:self didLoadData:data];
                                                      [self.client URLProtocolDidFinishLoading:self];
                                                  }];
}

- (void)stopLoading {
    [self.connection cancel];
    self.connection = nil;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    NSMutableURLRequest *mutableReqeust = [request mutableCopy];
    mutableReqeust = [self redirectHostInRequset:mutableReqeust];
    return mutableReqeust;
}

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)equivalent toRequest:(NSURLRequest *)request; {
    return [super requestIsCacheEquivalent:equivalent toRequest:request];
}

+ (NSMutableURLRequest *)redirectHostInRequset:(NSMutableURLRequest *)request {
    return request;
}

此外代理

#pragma mark - NSURLConnectionDataDelegate

// 请求响应时
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}

// 请求接收数据时
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.client URLProtocol:self didLoadData:data];
}

// 请求完成的代理
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.client URLProtocolDidFinishLoading:self];
}

// 请求失败&错误的代理
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [self.client URLProtocol:self didFailWithError:error];
}

PS:流程图
流程图链接processon

 /** * 自定义的BitmapUtils,实现三级缓存 */ public class MyBitmapUtils { private NetCacheUtils mNetCacheUtils; private LocalCacheUtils mLocalCacheUtils; private MemoryCacheUtils mMemoryCacheUtils; public MyBitmapUtils(){ mMemoryCacheUtils=new MemoryCacheUtils(); mLocalCacheUtils=new LocalCacheUtils(); mNetCacheUtils=new NetCacheUtils(mLocalCacheUtils,mMemoryCacheUtils); } public void disPlay(ImageView ivPic, String url) { ivPic.setImageResource(R.mipmap.pic_item_list_default); Bitmap bitmap; //内存缓存 bitmap=mMemoryCacheUtils.getBitmapFromMemory; if (bitmap!=null){ ivPic.setImageBitmap; System.out.println("从内存获取图片啦....."); return; } //本地缓存 bitmap = mLocalCacheUtils.getBitmapFromLocal; if(bitmap !=null){ ivPic.setImageBitmap; System.out.println("从本地获取图片啦....."); //从本地获取图片后,保存至内存中 mMemoryCacheUtils.setBitmapToMemory(url,bitmap); return; } //网络缓存 mNetCacheUtils.getBitmapFromNet(ivPic,url); } }

总结

在选拔了Webp之后,经QA同事的频繁测量检验,雷同生机勃勃套步骤下比未优化前流量节省了54%,使用NSU汉兰达LProtocol缓存方案后,在WebP优化根基上又优化了12%的流量。其实NSU索罗德LProtocol的成效远远不仅那些,NSULANDLProtocol便是一个黑法力,有意思味的童鞋能够深入钻研一下。前日就写到这里吧。

  • 互联网缓存中要害运用了AsyncTask来扩充异步数据的加载
  • 总的来讲的话,AsyncTask能够用作是三个对handler和线程池的包裹,常常,AsyncTask主要用来数据不难时,handler+thread首要用来数据量多且复杂时,当然那亦不是必得的,仁者见仁智者见智仁者见仁智者见智
  • 再就是,为了制止内存溢出的标题,大家能够在收获网络图片后。对其张开图纸压缩

 /** * 三级缓存之网络缓存 */ public class NetCacheUtils { private LocalCacheUtils mLocalCacheUtils; private MemoryCacheUtils mMemoryCacheUtils; public NetCacheUtils(LocalCacheUtils localCacheUtils, MemoryCacheUtils memoryCacheUtils) { mLocalCacheUtils = localCacheUtils; mMemoryCacheUtils = memoryCacheUtils; } /** * 从网络下载图片 * @param ivPic 显示图片的imageview * @param url 下载图片的网络地址 */ public void getBitmapFromNet(ImageView ivPic, String url) { new BitmapTask().execute(ivPic, url);//启动AsyncTask } /** * AsyncTask就是对handler和线程池的封装 * 第一个泛型:参数类型 * 第二个泛型:更新进度的泛型 * 第三个泛型:onPostExecute的返回结果 */ class BitmapTask extends AsyncTask<Object, Void, Bitmap> { private ImageView ivPic; private String url; /** * 后台耗时操作,存在于子线程中 * @param params * @return */ @Override protected Bitmap doInBackground(Object[] params) { ivPic = (ImageView) params[0]; url =  params[1]; return downLoadBitmap; } /** * 更新进度,在主线程中 * @param values */ @Override protected void onProgressUpdate(Void[] values) { super.onProgressUpdate; } /** * 耗时方法结束后执行该方法,主线程中 * @param result */ @Override protected void onPostExecute(Bitmap result) { if (result != null) { ivPic.setImageBitmap; System.out.println("从网络缓存图片啦....."); //从网络获取图片后,保存至本地缓存 mLocalCacheUtils.setBitmapToLocal(url, result); //保存至内存中 mMemoryCacheUtils.setBitmapToMemory(url, result); } } } /** * 网络下载图片 * @param url * @return */ private Bitmap downLoadBitmap(String url) { HttpURLConnection conn = null; try { conn = (HttpURLConnection) new URL.openConnection(); conn.setConnectTimeout; conn.setReadTimeout; conn.setRequestMethod; int responseCode = conn.getResponseCode(); if (responseCode == 200) { //图片压缩 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize=2;//宽高压缩为原来的1/2 options.inPreferredConfig=Bitmap.Config.ARGB_4444; Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream(),null,options); return bitmap; } } catch (IOException e) { e.printStackTrace(); } finally { conn.disconnect(); } return null; } }
  • 在初次因而互连网获取图片后,大家得以在本土CF卡中将图片保存起来
  • 能够选拔MD5加密图片的互连网地址,来作为图片的名号保存

 /** * 三级缓存之本地缓存 */ public class LocalCacheUtils { private static final String CACHE_PATH= Environment.getExternalStorageDirectory().getAbsolutePath()+"/WerbNews"; /** * 从本地读取图片 * @param url */ public Bitmap getBitmapFromLocal(String url){ String fileName = null;//把图片的url当做文件名,并进行MD5加密 try { fileName = MD5Encoder.encode; File file=new File(CACHE_PATH,fileName); Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream; return bitmap; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 从网络获取图片后,保存至本地缓存 * @param url * @param bitmap */ public void setBitmapToLocal(String url,Bitmap bitmap){ try { String fileName = MD5Encoder.encode;//把图片的url当做文件名,并进行MD5加密 File file=new File(CACHE_PATH,fileName); //通过得到文件的父文件,判断父文件是否存在 File parentFile = file.getParentFile(); if (!parentFile.exists{ parentFile.mkdirs(); } //把图片保存至本地 bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream; } catch (Exception e) { e.printStackTrace(); } } }
  • 那是本文中最重大且必要珍视介绍的局地
  • 开展内部存款和储蓄器缓存,就确定要留神三个主题材料,这正是内部存款和储蓄器溢出(OutOfMemory)
  • 为啥会促成内部存储器溢出?

    • Android 设想机默许分配给各类App
      16M的内存空间,真机缘比16M大,但任会合世内部存款和储蓄器溢出的图景

    • Android
      系统在加载图片时是剖判每二个像素的消息,再把每二个像素全体封存至内部存款和储蓄器中

    • 图片大小 = 图片的总像素 * 每一种像素占用的尺寸

      单色图:每一个像素占用1/8个字节,16色图:种种像素占用56%个字节,256色图:每种像素占用1个字节,二十四个人图:每种像素占用3个字节(多如牛毛的rgb构成的图纸)

    • 例如一埃尔克森九二〇x1080的JPG图片,在Android
      系统中是以AHighlanderGB格式深入解析的,即叁个像素需占用4个字节,图片的大小=1919x1080x4=7M

  • 兑现情势:

    • 通过
      HashMap<String,Bitmap>键值没错措施保存图片,key为地址,value为图片对象,但因是强援引对象,非常轻巧产生内存溢出,可以尝试SoftReference软引用对象
    • 通过 HashMap<String, SoftReference<Bitmap>>SoftReference
      为软援引对象(GC垃圾回笼会自行回笼软引用对象),但在Android2.3+后,系统会预先考虑回笼弱引用对象,官方提议应用LruCache
    • 通过 LruCache<String,Bitmap> least recentlly use
      起码近期接受算法会将内部存款和储蓄器调整在必然的深浅内,
      超过最大值时会自动回笼, 那几个最大值开荒者本身定

 /** * 三级缓存之内存缓存 */ public class MemoryCacheUtils { // private HashMap<String,Bitmap> mMemoryCache=new HashMap<>();//1.因为强引用,容易造成内存溢出,所以考虑使用下面弱引用的方法 // private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new HashMap<>();//2.因为在Android2.3+后,系统会优先考虑回收弱引用对象,官方提出使用LruCache private LruCache<String,Bitmap> mMemoryCache; public MemoryCacheUtils(){ long maxMemory = Runtime.getRuntime().maxMemory()/8;//得到手机最大允许内存的1/8,即超过指定内存,则开始回收 //需要传入允许的内存最大值,虚拟机默认内存16M,真机不一定相同 mMemoryCache=new LruCache<String,Bitmap> maxMemory){ //用于计算每个条目的大小 @Override protected int sizeOf(String key, Bitmap value) { int byteCount = value.getByteCount(); return byteCount; } }; } /** * 从内存中读图片 * @param url */ public Bitmap getBitmapFromMemory(String url) { //Bitmap bitmap = mMemoryCache.get;//1.强引用方法 /*2.弱引用方法 SoftReference<Bitmap> bitmapSoftReference = mMemoryCache.get; if (bitmapSoftReference != null) { Bitmap bitmap = bitmapSoftReference.get(); return bitmap; } */ Bitmap bitmap = mMemoryCache.get; return bitmap; } /** * 往内存中写图片 * @param url * @param bitmap */ public void setBitmapToMemory(String url, Bitmap bitmap) { //mMemoryCache.put(url, bitmap);//1.强引用方法 /*2.弱引用方法 mMemoryCache.put(url, new SoftReference<>; */ mMemoryCache.put(url,bitmap); } }


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图