ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:88.23KB ,
资源ID:4328733      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/4328733.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(2023年Android批量图片加载经典系列采用二级缓存异步加载网络图片烟台杰瑞教育Android培.docx)为本站上传会员【精****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

2023年Android批量图片加载经典系列采用二级缓存异步加载网络图片烟台杰瑞教育Android培.docx

1、Android批量图片加载经典系列采用二级缓存、异步加载网络图片一、问题描述Android应用中常常波及从网络中加载大量图片,为提高加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文献中获取,最终才会访问网络。内存缓存(一级)本质上是Map集合以key-value对方式存储图片url和Bitmap信息,由于内存缓存会导致堆内存泄露, 管理相对复杂某些,可采用第三方组件,对于有经验可自己编写组件,而文献缓存比较简朴一般自己封装一下即可。下面就通过案例看怎样实现网络图片加载优化。二、案例简介案例新闻列表图片三、重要关键组件下面先看看实现一级缓存(

2、内存)、二级缓存(磁盘文献)所编写组件1、MemoryCache在内存中存储图片(一级缓存),采用了1个map来缓存图片代码如下:public class MemoryCache / 最大缓存数 private static final int MAX_CACHE_CAPACITY = 30; /用Map软引用Bitmap对象,保证内存空间足够状况下不会被垃圾回收 private HashMapString,SoftReference mCacheMap = new LinkedHashMapString,SoftReference() private static final long se

3、rialVersionUID = 1L;/当缓存数量超过规定大小(返回true)会清除最早放入缓存 protected boolean removeEldestEntry(Map.EntryString,SoftReference eldest) return size() MAX_CACHE_CAPACITY; ; /* * 从缓存里取出图片 * param id * return 假如缓存有,并且该图片没被释放,则返回该图片,否则返回null */ public Bitmap get(String id) if(!mCacheMap.containsKey(id) return null;

4、 SoftReference ref = mCacheMap.get(id); return ref.get(); /* * 将图片加入缓存 * param id * param bitmap */ public void put(String id,Bitmap bitmap) mCacheMap.put(id,new SoftReference(bitmap); /* * 清除所有缓存 */ public void clear() try for(Map.EntryString,SoftReferenceentry :mCacheMap.entrySet() SoftReference s

5、r = entry.getValue(); if(null != sr) Bitmap bmp = sr.get(); if(null != bmp) bmp.recycle(); mCacheMap.clear(); catch (Exception e) e.printStackTrace(); 2、FileCache在磁盘中缓存图片(二级缓存),代码如下 public class FileCache /缓存文献目录 private File mCacheDir; /* * 创立缓存文献目录,假如有SD卡,则使用SD,假如没有则使用系统自带缓存目录 * param context * pa

6、ram cacheDir 图片缓存一级目录 */public FileCache(Context context,File cacheDir,String dir)if(android.os.Environment.getExternalStorageState().equals、(android.os.Environment.MEDIA_MOUNTED) mCacheDir = new File(cacheDir,dir); else mCacheDir = context.getCacheDir();/ 怎样获取系统内置缓存存储途径 if(!mCacheDir.exists() mCach

7、eDir.mkdirs(); public File getFile(String url) File f=null; try /对url进行编辑,处理中文途径问题 String filename = URLEncoder.encode(url,utf-8); f = new File(mCacheDir,filename); catch (UnsupportedEncodingException e) e.printStackTrace(); return f; public void clear()/清除缓存文献 File files = mCacheDir.listFiles(); fo

8、r(File f:files)f.delete();3、编写异步加载组件AsyncImageLoaderandroid中采用单线程模型即应用运行在UI主线程中,且Android又是实时操作系统规定及时响应否则出现ANR错误,因而对于耗时操作规定不能阻塞UI主线程,需要启动一种线程处理(如本应用中图片加载)并将线程放入队列中,当运行完毕后再告知UI主线程进行更改,同步移除任务这就是异步任务,在android中实现异步可通过本系列一中所用到AsyncTask或者使用thread+handler机制,在这里是完全是通过代码编写实现,这样咱们可以更清晰看到异步通信实现本质,代码如下public cla

9、ss AsyncImageLoader private MemoryCache mMemoryCache;/内存缓存 private FileCache mFileCache;/文献缓存 private ExecutorService mExecutorService;/线程池/记录已经加载图片ImageView private Map mImageViews = Collections .synchronizedMap(new WeakHashMap();/保留正在加载图片url private List mTaskQueue = new ArrayList(); /* * 默认采用一种大小

10、为5线程池 * param context * param memoryCache 所采用高速缓存 * param fileCache 所采用文献缓存 */ public AsyncImageLoader(Context context,MemoryCache memoryCache,FileCache fileCache) mMemoryCache = memoryCache; mFileCache = fileCache; mExecutorService = Executors.newFixedThreadPool(5);/建立一种容量为5固定尺寸线程池(最大正在运行线程数量) /* *

11、 根据url加载对应图片 * param url * return 先从一级缓存中取图片有则直接返回,假如没有则异步从文献(二级缓存)中取,假如没有再从网络端获取 */ public Bitmap loadBitmap(ImageView imageView,String url) /先将ImageView记录到Map中,体现该ui已经执行过图片加载了 mImageViews.put(imageView,url); Bitmap bitmap = mMemoryCache.get(url);/先从一级缓存中获取图片 if(bitmap = null) enquequeLoadPhoto(url

12、,imageView);/再从二级缓存和网络中获取 return bitmap; /* * 加入图片下载队列 * param url */ private void enquequeLoadPhoto(String url,ImageView imageView) /假如任务已经存在,则不重新添加 if(isTaskExisted(url) return; LoadPhotoTask task = new LoadPhotoTask(url,imageView); synchronized (mTaskQueue) mTaskQueue.add(task);/将任务添加到队列中 mExecut

13、orService.execute(task);/向线程池中提交任务,假如没有到达上限(5),则运行否则被阻塞 /* * 判断下载队列中与否已经存在该任务 * param url * return */ private boolean isTaskExisted(String url) if(url = null) return false; synchronized (mTaskQueue) int size = mTaskQueue.size(); for(int i=0;isize;i+) LoadPhotoTask task = mTaskQueue.get(i); if(task !

14、= null & task.getUrl().equals(url) return true; return false; /* * 从缓存文献或者网络端获取图片 * param url */ private Bitmap getBitmapByUrl(String url) File f = mFileCache.getFile(url);/获得缓存图片途径 Bitmap b = ImageUtil.decodeFile(f);/获得文献Bitmap信息 if (b != null)/不为空体现获得了缓存文献 return b; return ImageUtil.loadBitmapFrom

15、Web(url,f);/同网络获得图片 /* * 判断该ImageView与否已经加载过图片了(可用于判断与否需要进行加载图片) * param imageView * param url * return */ private boolean imageViewReused(ImageView imageView,String url) String tag = mImageViews.get(imageView); if (tag = null | !tag.equals(url) return true; return false; private void removeTask(Loa

16、dPhotoTask task) synchronized (mTaskQueue) mTaskQueue.remove(task); class LoadPhotoTask implements Runnable private String url; private ImageView imageView; LoadPhotoTask(String url,ImageView imageView) this.url = url; this.imageView = imageView; Override public void run() if (imageViewReused(imageV

17、iew,url) /判断ImageView与否已经被复用 removeTask(this);/假如已经被复用则删除任务 return; Bitmap bmp = getBitmapByUrl(url);/从缓存文献或者网络端获取图片 mMemoryCache.put(url,bmp);/ 将图片放入到一级缓存中 if (!imageViewReused(imageView,url) /若ImageView未加图片则在ui线程中显示图片 BitmapDisplayer bd = new BitmapDisplayer(bmp,imageView,url); Activity a = (Activ

18、ity) imageView.getContext(); a.runOnUiThread(bd);/在UI线程调用bd组件run措施,实现为ImageView控件加载图片 removeTask(this);/从队列中移除任务 public String getUrl() return url; /* * *由UI线程中执行该组件run措施 */ class BitmapDisplayer implements Runnable private Bitmap bitmap; private ImageView imageView; private String url; public Bitma

19、pDisplayer(Bitmap b,ImageView imageView,String url) bitmap = b; this.imageView = imageView; this.url = url; public void run() if (imageViewReused(imageView,url) return; if (bitmap != null) imageView.setImageBitmap(bitmap); /* * 释放资源 */ public void destroy() mMemoryCache.clear(); mMemoryCache = null;

20、 mImageViews.clear(); mImageViews = null; mTaskQueue.clear(); mTaskQueue = null; mExecutorService.shutdown(); mExecutorService = null; 编写完毕之后,对于异步任务执行只需调用AsyncImageLoader中loadBitmap()措施即可非常以便,对于AsyncImageLoader组件代码最佳结合注释好好理解一下,这样对于Android中线程之间异步通信就会有深刻认识。4、工具类ImageUtilpublic class ImageUtil /* * 从网络

21、获取图片,并缓存在指定文献中 * param url 图片url * param file 缓存文献 * return */ public static Bitmap loadBitmapFromWeb(String url,File file) HttpURLConnection conn = null; InputStream is = null; OutputStream os = null; try Bitmap bitmap = null; URL imageUrl = new URL(url); conn = (HttpURLConnection) imageUrl.openCon

22、nection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); is = conn.getInputStream(); os = new FileOutputStream(file); copyStream(is,os);/将图片缓存到磁盘中 bitmap = decodeFile(file); return bitmap; catch (Exception ex) ex.printStackTrace(); return null; fin

23、ally try if(os != null) os.close(); if(is != null) is.close(); if(conn != null) conn.disconnect(); catch (IOException e) public static Bitmap decodeFile(File f) try return BitmapFactory.decodeStream(new FileInputStream(f),null,null); catch (Exception e) return null; private static void copyStream(In

24、putStream is,OutputStream os) final int buffer_size = 1024; try byte bytes = new bytebuffer_size; for (;) int count = is.read(bytes,0,buffer_size); if (count = -1) break; os.write(bytes,0,count); catch (Exception ex) ex.printStackTrace(); 四、测试应用组件之间时序图:1、编写MainActivitypublic class MainActivity exten

25、ds Activity ListView list; ListViewAdapter adapter; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); list=(ListView)findViewById(R.id.list); adapter=new ListViewAdapter(this,mStrings); list.setAdapter(adapter); public void on

26、Destroy() list.setAdapter(null); super.onDestroy(); adapter.destroy(); private String mStrings= ,.;2、编写适配器public class ListViewAdapter extends BaseAdapter private Activity mActivity; private String data; private static LayoutInflater inflater=null; private AsyncImageLoader imageLoader;/异步组件 public L

27、istViewAdapter(Activity mActivity,String d) this.mActivity=mActivity; data=d; inflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); MemoryCache mcache=new MemoryCache();/内存缓存 File sdCard = android.os.Environment.getExternalStorageDirectory();/获得SD卡 File cacheDir = n

28、ew File(sdCard,jereh_cache );/缓存根目录 FileCache fcache=new FileCache(mActivity,cacheDir,news_img);/文献缓存 imageLoader = new AsyncImageLoader(mActivity,mcache,fcache); public int getCount() return data.length; public Object getItem(int position) return position; public long getItemId(int position) return

29、 position; public View getView(int position,View convertView,ViewGroup parent) ViewHolder vh=null; if(convertView=null) convertView = inflater.inflate(R.layout.item,null); vh=new ViewHolder(); vh.tvTitle=(TextView)convertView.findViewById(R.id.text); vh.ivImg=(ImageView)convertView.findViewById(R.id

30、.image); convertView.setTag(vh); else vh=(ViewHolder)convertView.getTag(); vh.tvTitle.setText(标题信息测试 +position); vh.ivImg.setTag(dataposition); /异步加载图片,先从一级缓存、再二级缓存、最终网络获取图片 Bitmap bmp = imageLoader.loadBitmap(vh.ivImg,dataposition); if(bmp = null) vh.ivImg.setImageResource(R.drawable.default_big); else vh.ivImg.setImageBitmap(bmp); return convertView; private class ViewHolder TextView tvTitle; ImageView ivImg; public void destroy() imageLoader.destroy();

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服