当前位置: 首页 > 科技观察

Android解决大量图片下载:软引用必须了解4点

时间:2023-03-12 09:07:54 科技观察

1.对象的强引用、软引用、弱引用和幻引用为了能够更加灵活的控制对象的生命周期,必须知道对象引用的4个级别,从高到低依次为:强引用、软引用、弱引用和虚引用备注:这四种类型的区别:⑴强引用(StrongReference)强引用是最常用的引用。如果一个对象有强引用,垃圾收集器将永远不会收集它。当内存空间不足时,Java虚拟机宁可抛出OutOfMemoryError错误导致程序异常终止,也不会通过强引用对象的任意回收来解决内存不足的问题。⑵软引用(SoftReference)如果一个对象只有软引用,内存空间足够,垃圾回收器不会回收;如果内存空间不足,就会回收这些对象的内存。只要垃圾收集器不收集它,该对象就可以被程序使用。软引用可用于实现对内存敏感的缓存(下面给出示例)。软引用可以与引用队列(ReferenceQueue)结合使用。如果软引用引用的对象被垃圾回收器回收,Java虚拟机会将软引用添加到与其关联的引用队列中。(3)弱引用(WeakReference)弱引用和软引用的区别在于只有弱引用的对象生命周期更短。在垃圾回收线程扫描其管辖内存区域的过程中,一旦发现只有弱引用的对象,无论当前内存空间是否足够,都会回收其内存。然而,由于垃圾收集器是一个非常低优先级的线程,只有弱引用的对象可能无法快速找到。弱引用可以与引用队列(ReferenceQueue)结合使用。如果弱引用引用的对象被垃圾回收,Java虚拟机会将弱引用添加到与其关联的引用队列中。⑷幻引用(PhantomReference)“幻引用”,顾名思义,名存实亡,与其他类型的引用不同,幻引用不决定对象的生命周期。如果一个对象只持有虚引用,就好像它没有引用一样,随时可能被垃圾收集器回收。幻象引用主要用于跟踪被垃圾收集器回收的对象的活动。幻影引用与软引用和弱引用的区别之一是幻影引用必须与引用队列(ReferenceQueue)结合使用。当垃圾回收器要回收一个对象时,如果发现它还有一个虚引用,就会把这个虚引用添加到与之关联的引用队列中,然后再回收该对象的内存。ReferenceQueuequeue=newReferenceQueue();PhantomReferencepr=newPhantomReference(object,queue);程序可以通过判断引用队列中是否加入了幻引用来获知被引用对象是否会被垃圾回收。如果程序发现引用队列中加入了虚引用,则可以在被引用对象的内存被回收之前采取必要的动作。2、软引用的工作原理和作用如果一个对象只有软引用,内存空间足够的话,垃圾回收器是不会回收的;如果内存空间不足,就会回收这些对象的内存。只要垃圾收集器不收集它,该对象就可以被程序使用。软引用可用于实现对内存敏感的缓存。软引用可以与引用队列(ReferenceQueue)结合使用。如果软引用引用的对象被垃圾回收器回收,Java虚拟机就会将软引用添加到它上面。关联的引用队列。3、android中大批量图片下载及内存管理的解决思路:(1)根据路径下载图片,下载完成后将图片保存在imageCache(HashTable)中,将图片下载到本地;(2))下载到第200次以上,如果应用内存不足(SoftReferencesoftReference决定不oom),android虚拟机就会开始垃圾回收对象。如果为null,则需要根据图片的id和路径找到下载的图片,直接加载显示。如果本地没有下载,可以直接从网上下载;可以参考:http://www.2cto.com/kf/201207/139035.html将图片加载的过程封装成一个下载器,重点解决图片下载和缓存问题;这里使用单线程下载,可以使用多线程下载,下载速度更快;代码如下:){returndrawable;}}finalHandlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemessage){imageCallback.imageLoaded((Drawable)message.obj,imageUrl);}};newThread(){@Overridepublicvoidrun(){Drawabledrawable=null;try{drawable=getDrawable(imageUrl);imageCache。put(imageUrl,newSoftReference(drawable));}catch(Exceptione){e.printStackTrace();}Messagemessage=handler.obtainMessage(0,drawable);handler.sendMessage(message);}}.start();returnnull;}privateDrawablegetDrawable(StringurlString)throwsException{if(!NetTools.isWifiConnected(context)){getImage=DataPreference.getIsAutoGetPicture(context);}else{getImage=true;}StringfileName=urlString.substring(urlString.lastIndexOf("/")+1).trim();FilecacheFile=null;if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//sdcard已经挂载cacheFile=newFile(shopPicInSdcard+fileName);if(getImage){if(!cacheFile.exists()&&cacheFile.createNewFile()){//缓存文件不存在&&创建文件,下载缓存图片到SdcardInputStreamInputStream=getInputStreamFromHttp(urlString);writeCacheFile2SDCard(cacheFile,readStream(inputStream));}returnBitmapDrawable.createFromPath(shopPicInSdcard+fileName);}else{returnull;}}else{//只有在没有sdcard的情况下才从网上获取数据流if(getImage){InputStreaminputStream=getInputStreamFromHttp(urlString);returnDrawable.createFromStream(inputStream,urlString);}else{returnnull;}}}4、android在listview获取View时处理图片的方式;主要优化listview的效率。