-
13 你可以使用 GreenDroid的异步图像视图 .只需打电话 设置URL . – 帕斯卡·迪马西莫 评论 2011年12月9日15:11 -
8 我已经用过了。这是一个很好的实现。 坏消息是,AsyncImageView是一个大型GreenDroid项目的一部分,这使得您的应用程序更大,即使在这种情况下,您所需要的只是AsyncImageView。 此外,GreenDroid项目似乎自2011年以来就没有更新过。 – 鲍里斯特尔 评论 2012年4月15日11:06 -
6 您甚至可以尝试使用此库: Android-http-image-manager机器人 在我看来,它最适合异步加载图像。 – Ritesh Kumar Dubey公司 评论 2012年11月9日11:43 -
36 只要用毕加索的作品,一切都会自己完成的。” 毕加索.with(yourContext).load(img src/path/drawable here).into(imageView即您的目标);' 就是这样! – 教练阿努杰·沙玛 评论 2014年1月23日6:40 -
10 尝试使用: github.com/nostra13/Android-Universal-Image-Loader ,此库对于延迟加载和图像缓存非常快速高效 – 克鲁纳尔帕特尔 评论 2014年8月16日5:44
41个答案
软件包com.wilson.android.library; /* 根据一项或多项授权给Apache Software Foundation(ASF) 贡献者许可协议。 请参阅NOTICE文件 与此工作一起分发以获取更多信息 关于版权所有权。 ASF许可此文件 根据Apache许可证2.0版( “许可证”); 除非符合规定,否则您不能使用此文件 使用许可证。 您可以在以下地址获得许可证副本: http://www.apache.org/licenses/LICENSE-2.0 除非适用法律要求或书面同意, 根据许可证分发的软件在 “按原样”,无任何保证或条件 KIND,明示或暗示。 请参阅许可证 管理权限和限制的特定语言 根据许可证。 */ 导入java.io.IOException; 公共类DrawableManager{ 私有最终Map<String,Drawable>drawableMap; 公共DrawableManager(){ drawableMap=新的HashMap<String,Drawable>(); } public Drawable fetchDrawable(String urlString){ if(drawableMap.containsKey(urlString)){ return drawableMap.get(urlString); } Log.d(this.getClass().getSimpleName(),“图片url:”+urlString); 尝试{ InputStream is=获取(urlString); Drawable Drawable=Drawable.createFromStream(is,“src”); if(可提取!=空){ drawableMap.put(urlString,drawable); Log.d(this.getClass().getSimpleName()),“得到了一个可绘制的缩略图:”+drawable.getBounds()+“,” +drawable.getIntrinsic高度()+“,”+drawable.getIntrinsic宽度()+”,“ +drawable.getMinimumHeight()+“,”+drawable.getMinimumWidth()); }其他{ Log.w(this.getClass().getSimpleName(),“无法获取缩略图”); } 可回收; }catch(MalformedURLE异常e){ Log.e(this.getClass().getSimpleName(),“fetchDrawable失败”,e); 返回null; }捕获(IOException e){ Log.e(this.getClass().getSimpleName(),“fetchDrawable失败”,e); 返回null; } } public void fetchDrawableOnThread(final String urlString,final ImageView ImageView){ if(drawableMap.containsKey(urlString)){ imageView.setImageDrawable(drawableMap.get(urlString)); } 最终处理程序处理程序=新处理程序(Looper.getMainLooper()){ @覆盖 public void handleMessage(消息消息){ imageView.setImageDrawable((可绘制)消息.obj); } }; 线程=新线程(){ @覆盖 公共void run(){ //TODO:将imageView设置为“挂起”图像 Drawable Drawable=fetchDrawable(urlString); 消息消息=handler.obtainMessage(1,可绘制); handler.sendMessage(消息); } }; thread.start(); } 私有InputStream获取(String urlString)引发MalformedURLException、IOException{ DefaultHttpClient httpClient=新的DefaultHtt客户端(); HttpGet请求=新的HttpGet(urlString); HttpResponse响应=httpClient.execute(request); return response.getEntity().getContent(); } }
-
110 我认为您应该使用SoftReferences,这样您的程序就不会导致OutOfMemoryException。 由于GC可以在堆大小增加时清除软引用。。。 你可以管理你自己的一代,比如几秒钟后你可以把你的图像放在那个列表中,在加载之前,你应该检查图像是否存在,然后不要再下载它,而是从那个列表中收集它,并把它放回你的softref列表,过些时候你可以清除你的硬列表:) – 亚利桑那州_ 评论 2011年1月18日8:08 -
41 -
14 -
7 此代码有几个问题。 首先,您应该缓存Drawables,这将导致内存泄漏: stackoverflow.com/questions/7648740/… 其次,缓存本身从未被清除,因此它将永远增长,这是另一个内存泄漏。 – 土星九号 评论 2011年11月15日5:35 -
12
基本用法
ImageLoader ImageLoader=新ImageLoad(上下文)。。。 imageLoader。 显示图像(url,imageView);
别忘了添加 对您的AndroidManifest.xml具有以下权限:
<uses-permission android:name=“android.permission.INTERNET”/> <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>请
只创建一个ImageLoader实例并在您的 应用程序。 这样图像缓存将更加高效。
公共DrawableManager(){ drawableMap=新的HashMap<String,SoftReference<Drawable>>(); } public Drawable fetchDrawable(String urlString){ SoftReference<Drawable>drawableRef=drawableMap.get(urlString); if(drawableRef!=空){ Drawable Drawable=drawableRef.get(); if(可提取!=空) 可回收; //引用已过期,请从drawableMap中删除密钥 drawableMap.remove(urlString); } if(Constants.LOGGING)Log.d(this.getClass().getSimpleName(),“图像url:”+urlString); 尝试{ InputStream is=获取(urlString); Drawable Drawable=Drawable.createFromStream(is,“src”); drawableRef=新SoftReference<Drawable>(Drawable); drawableMap.put(urlString,drawableRef); if(Constants.LOGGING)Log.d(this.getClass().getSimpleName()),“获取缩略图可绘制:”+drawable.getBounds()+“,” +drawable.getIntrinsic高度()+“,”+drawable.getIntrinsic宽度()+”,“ +drawable.getMinimumHeight()+“,”+drawable.getMinimumWidth()); return drawableRef.get(); }catch(MalformedURLE异常e){ if(Constants.LOGGING)Log.e(this.getClass().getSimpleName(),“fetchDrawable failed”,e); 返回null; }捕获(IOException e){ if(Constants.LOGGING)Log.e(this.getClass().getSimpleName(),“fetchDrawable failed”,e); 返回null; } } public void fetchDrawableOnThread(final String urlString,final ImageView ImageView){ SoftReference<Drawable>drawableRef=drawableMap.get(urlString); if(drawableRef!=空){ Drawable Drawable=drawableRef.get(); if(可提取!=空){ imageView.setImageDrawable(drawableRef.get()); 回报; } //引用已过期,请从drawableMap中删除密钥 drawableMap.remove(urlString); } 最终处理程序处理程序=新处理程序(){ @覆盖 public void handleMessage(消息消息){ imageView.setImageDrawable((可绘制)消息.obj); } }; 线程=新线程(){ @覆盖 公共void run(){ //TODO:将imageView设置为“挂起”图像 Drawable Drawable=fetchDrawable(urlString); 消息消息=handler.obtainMessage(1,可绘制); handler.sendMessage(消息); } }; thread.start(); }
-
4 -
developer.android.com/reference/java/lang/ref/… SoftReference文档中有一条关于缓存的注释,请参阅“避免缓存软引用”一节。 大多数应用程序都应该使用android.util。 LruCache而不是软引用。 – 沃基拉姆 评论 2013年2月26日11:48 -
-
毕加索(上下文).load(“ http://i.imgur.com/DvpvklR.png “).转换为(imageView);
使用(this).load(“your-url-here”).into(imageView);
我意识到使用drawable比使用位图更快,所以我使用drawab 使用SoftReference很好,但它会使缓存的图像被频繁删除,所以我添加了一个包含图像引用的链接列表,防止图像被删除,直到达到预定义的大小 为了打开InputStream,我使用了java.net。 URLConnection允许我使用web缓存(您需要先设置响应缓存,但这是另一回事)
导入java.util。 地图; 导入java.util。 HashMap; 导入java.util。 链接列表; 导入java.util。 收藏; 导入java.util。 WeakHashMap; 导入java.lang.ref.SoftReference; 导入java.util.concurrent。 执行人; 导入java.util.concurrent。 执行服务; 导入android.graphics.drawable。 可提取; 导入android.widget。 ImageView; 导入android.os。 经办人; 导入android.os。 消息; 导入java.io.InputStream; 导入java.net。 畸形URL异常; 导入java.io.IOException; 导入java.net。 URL; 导入java.net。 URL连接; 公共类DrawableBackgroundDownloader{ private final Map<String,SoftReference<Drawable>>mCache=new HashMap<String,软引用<Drawable>>(); private final LinkedList<Drawable>mChacheController=新LinkedList<Drawable>(); 私有ExecutorService mThreadPool; private final Map<ImageView,String>mImageViews=Collections.synchronizedMap(new WeakHashMap<ImageView,String>()); 公共静态int MAX_CACHE_SIZE=80; public int THREAD_POOL_SIZE=3; /** *施工单位 */ 公共DrawableBackgroundDownloader(){ mThreadPool=Executors.newFixedThreadPool(THREAD_POOL_SIZE); } /** *清除所有实例数据并停止运行线程 */ public void重置(){ ExecutorService旧线程池=mThreadPool; mThreadPool=Executors.newFixedThreadPool(THREAD_POOL_SIZE); oldThreadPool.shutdownNow(); mChacheController.clear(); mCache.clear(); mImageViews.clear(); } public void loadDrawable(最终String url,最终ImageView ImageView,Drawable占位符){ mImageViews.put(图像视图,url); 可绘制可绘制=getDrawableFromCache(url); //签入UI线程,因此没有并发问题 if(drawable!=null){ //Log.d(空,“从mCache加载的项:”+url); imageView.setImageDrawable(可绘制); }其他{ imageView.setImageDrawable(占位符); queueJob(url、imageView、占位符); } } private Drawable getDrawableFromCache(字符串url){ if(mCache.containsKey(url)){ 返回mCache.get(url).get(); } 返回null; } 私有同步void putDrawableInCache(String url,Drawable Drawable){ int chacheControllerSize=mChacheControll.size(); if(chacheControllerSize>MAX_CACHE_SIZE) mChacheController.subList(0,MAX_CACHE_SIZE/2).clear(); mChacheController.addLast(可绘制); mCache.put(url,新SoftReference<Drawable>(Drawable)); } private void queueJob(最终String url,最终ImageView ImageView,最终Drawable占位符){ /*在UI线程中创建处理程序。*/ final Handler处理程序=new Handler(){ @覆盖 public void handleMessage(消息消息){ 字符串标记=mImageViews.get(imageView); if(标记!=空&&tag.equals(url)){ if(imageView.isShown()) if(msg.obj!=空){ imageView.setImageDrawable(可绘制)msg.obj); }其他{ imageView.setImageDrawable(占位符); //Log.d(null,“fail”+url); } } } }; mThreadPool.submit(新的Runnable(){ @覆盖 公共void run(){ final Drawable bmp=downloadDrawable(url); //如果视图不再可见,则图像将在缓存中准备好下次使用 if(imageView.isShown()) { 消息消息=Message.obtain(); message.obj=bmp; //Log.d(空,“下载的项目:”+url); handler.sendMessage(消息); } } }); } private Drawable downloadDrawable(字符串url){ 尝试{ InputStream为=getInputStream(url); Drawable Drawable=Drawable.createFromStream(is,url); putDrawableInCache(url,drawable); 可回收; }catch(MalformedURLException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } 返回null; } 私有输入流getInputStream(String urlString)引发MalformedURLException、IOException{ URL URL=新URL(urlString); URL连接连接; 连接=url.openConnection(); connection.setUseCaches(true); connection.connect(); 输入流响应=connection.getInputStream(); 返回响应; } }
-
-
6 如果这样可以节省其他人的时间: 导入java.util。 地图; 导入java.util。 HashMap; 导入java.util。 链接列表; 导入java.util。 收藏; 导入java.util。 WeakHashMap; 导入java.lang.ref.SoftReference; 导入java.util.concurrent。 执行人; 导入java.util.concurrent。 执行服务; 导入android.graphics.drawable。 可提取; 导入android.widget。 ImageView; 导入android.os。 经办人; 导入android.os。 消息; 导入java.io.InputStream; 导入java.net。 畸形URL异常; 导入java.io.IOException; 导入java.net。 URL; 导入java.net。 URL连接; – 麦克里德 评论 2012年1月8日5:01 -
-
此外,我认为最好在executorService(mThreadPool)中使用后进先出队列,而不是默认的FIFO,以便首先加载最后请求的图像(可能是可见的图像)。 请参见 stackoverflow.com/questions/4620061/how-to-create-lifo-executor(如何创建lifo-executor) – 胡安·埃尔南德斯 评论 2012年2月7日16:19 -
10 @MichaelReed,如果您是Eclipse用户,我建议您使用Ctrl-Shift-O(这是字母O,而不是数字0)。 它自动化了添加导入的过程并为您组织它们。 如果您在Mac上,请使用Command-Shift-O。 评论 2012年3月20日15:21
实现“com.squareup.picasso:picasso:(插入最新版本)”
毕加索.get().load(“ http://i.imgur.com/DvpvklR.png “).转换为(imageView);
存储库{ mavenCentral() 谷歌() } 依赖关系{ 实现“com.github.bumptech.glide:glide:4.11.0” annotationProcessor“com.github.bumptech.glide:编译器:4.11.0” }
带(this).load(“ http://i.imgur.com/DvpvklR.png “).转换为(imageView);
-
本教程可能会为PICASOO提供更多帮助:- androidtutorialshub.com/… 和GLIDE:- androidtutorialshub.com/… – 拉利特·瓦桑 评论 2017年5月10日6:54
-
对每个图像使用线程也是我使用的方法。 如果将模型与视图分离,则可以将模型持久化到“活动”之外(如“应用程序”类中),以保持它们的缓存。 如果您有许多图像,请注意资源不足。 – 詹姆斯·威尔逊 评论 2009年2月15日0:40 -
-
14 -
-
三 未编译ImageDownloader类:请参阅下面的解决方案 code.google.com/p/parleys-android-nextgen/issues/detail? id=1 – 山姆 评论 2012年2月4日4:48
开源,但由 杰克·沃顿 属于 ActionBarSherlock公司 名声。 使用一行代码从网络或应用程序资源异步加载图像 自动 列表视图 侦查 自动磁盘和内存缓存 可以进行自定义转换 许多可配置选项 超简单API 经常更新
-
2 我认为这是最好的解决方案-其他答案都很古老-凌空截击真的很快,并且结合了jake warthons disklrucache,这是一个很好的解决方案–我尝试了很多其他的解决方案,但没有一个能像凌空截杀那样稳定快速 评论 2014年9月7日22:19
@覆盖 public View getView(int position,View convertView,ViewGroup parent){ 视图v=convertView; 如果(v==空){ LayoutInfluer vi=(LayoutINfluer)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v=vi.inflate(R.layout.row,空); } ImageView ImageView=(ImageView)v.findViewById(R.id.icon); AQuery aq=新AQuery(convertView); 字符串imageUrl=“ http://www.vikispot.com/z/images/vikisport/android-w.png "; aq.id(imageview).progress(this).image(imageUrl,真,真,0,0,新位图AjaxCallback(){ @覆盖 公共void回调(String url、ImageView iv、Bitmap bm、AjaxStatus状态){ iv.setImageBitmap(bm); } )); 返回v; }
-
很好的工作,我,但需要一个Jar文件,包括在您的项目。 您可以从这里下载JAR文件AQuery androidAQuery=new AQuery(this); 链接是: code.google.com/archive/p/android-query/downloads – 塞利姆·拉扎 评论 2017年4月24日9:13
-
嗨,我已经看了代码示例,但我在使用带有ArrayAdapter的ImageFetcher时遇到问题,你介意看一下我的问题吗? stackoverflow.com/questions/21089147/… 谢谢=] – 马沙 评论 2014年1月13日10:37
DIY=>不是最好的解决方案,但对于一些图像,如果您想避免使用其他库的麻烦 排球的懒惰加载库=>来自android的玩家。 它很好,而且所有东西都记录得很差,因此使用起来很困难。 毕加索:一个简单可行的解决方案,你甚至可以指定你想要引入的确切图像大小。它使用起来很简单,但对于需要处理大量图像的应用程序来说,可能不是很“高效”。 UIL:延迟加载图像的最佳方式。 您可以缓存图像(当然需要权限),初始化加载程序一次,然后完成工作。 迄今为止我见过的最成熟的异步映像加载库。
<com.facebook.shimmer。 垫片框架布局 android:id=“@+id/simmer_view_container” android:layout_width=“wrap_content” android:layout_height=“wrap_content” 微光:持续时间=“1000”> <这里将显示您的内容/> </com.facebook.shimmer。 垫片框架布局>
ShimmerFrameLayout shimmerContainer=(ShimmerFrameworkLayout)findViewById(R.id.shimmer_view_container); shimmerContainer.startShimmerAnimation();
实现'com.facebook.shimmer:shimmer: 0.1.0@aar '
当您需要输入“正在加载图像…”之类的内容时 当您需要显示下载的图像时。
ImageView ImageView=(ImageView)findViewById(R.id.test_image); GlideDrawableImageViewTarget imagePreview=新的GlideDrafableImageView目标(imageView); 滑翔机 .带(这个) .load(url) .listener(新的RequestListener<String,GlideDrawable>(){ @覆盖 public boolean onException(异常e,字符串模型,目标<GlideDrawable>目标,boolean isFirstResource){ 返回false; } @覆盖 public boolean onResourceReady(GlideDrawable资源,字符串模型,Target<GlideDrafable>Target,boolean isFromMemoryCache,booleans isFirstResource){ 返回false; } }) .into(图像预览); }
公共类ImageDownloader{ Map<String,Bitmap>imageCache; 公共ImageDownloader(){ imageCache=新HashMap<字符串,位图>(); } //下载功能 公共void下载(String url,ImageView ImageView){ if(cancelPotentialDownload(url,imageView)){ //在此处缓存代码 String filename=String.valueOf(url.hashCode()); 文件f=新文件(getCacheDirectory(imageView.getContext()), 文件名); //位图在内存缓存中吗? 位图位图=空; bitmap=(位图)imageCache.get(f.getPath()); if(位图==空){ bitmap=BitmapFactory.decodeFile(f.getPath()); if(位图!=空){ imageCache.put(f.getPath(),位图); } } //没有? 下载它 if(位图==空){ 尝试{ BitmapDownloaderTask任务=新的Bitmap Downloader任务( 图像视图); DownloadedDrawable DownloadedDrawable=新下载的Drawable( 任务); imageView.setImageDrawable(已下载的Drawable); task.execute(url); }catch(异常e){ Log.e(“错误==>”,e.toString()); } }其他{ //是吗? 设置图像 imageView.setImageBitmap(位图); } } } //取消下载(仅限内部) private static boolean cancelPotentialDownload(字符串url, 图像视图图像视图){ BitmapDownloaderTask bitmapDonloaderTask=获取位图下载程序任务(图像视图); if(bitmapDownloaderTask!=空){ 字符串bitmapUrl=bitmapDownloaderTask.url; if((bitmapUrl==null)||(!bitmapUrl.equals(url)){ bitmapDownloaderTask.cancel(true); }其他{ //已在下载相同的URL。 返回false; } } 返回true; } //如果imageview已有下载,则获取现有下载 专用静态位图下载程序任务getBitmapDownloaderTask( 图像视图图像视图){ if(imageView!=空){ Drawable Drawable=imageView.getDrawable(); if(DownloadedDrawable的drawable实例){ DownloadedDrawable DownloadedDrawable=(Downloaded drawable)drawable; return downloadedDrawable.getBitmapDownloaderTask(); } } 返回null; } //我们的缓存功能 //查找目录以保存缓存的图像 私有静态文件getCacheDirectory(上下文上下文){ 字符串sdState=android.os。 Environment.getExternalStorageState(); 文件缓存目录; if(sdState.equals(android.os.Environment.MEDIA_MOUNTED)){ 文件sdDir=android.os。 Environment.getExternalStorageDirectory(); //TODO:在此处更改目录 cacheDir=新文件(sdDir,“data/ToDo/images”); }其他 cacheDir=上下文.getCacheDir(); if(!cacheDir.exists()) 缓存目录.mkdirs(); 返回cacheDir; } private void writeFile(位图bmp,文件f){ FileOutputStream输出=空; 尝试{ out=新的FileOutputStream(f); bmp.compression(Bitmap.CompressFormat.PNG,80,输出); }catch(异常e){ e.printStackTrace(); }最后{ 尝试{ if(out!=空) out.close(); }catch(异常ex){ } } } //下载异步任务 公共类BitmapDownloaderTask扩展了AsyncTask{ 私有字符串url; 私有最终WeakReference<ImageView>imageViewReference; 公共位图下载程序任务(ImageView ImageView){ imageViewReference=新的WeakReference<ImageView>(ImageView); } @覆盖 //实际下载方法,在任务线程中运行 受保护的位图doInBackground(字符串…参数){ //params来自execute()调用:params[0]是url。 url=(字符串)参数[0]; return downloadBitmap(参数[0]); } @覆盖 //下载图像后,将其与imageView关联 protected void onPostExecute(位图位图){ if(isCancelled()){ 位图=空; } if(imageViewReference!=空){ ImageView ImageView=imageViewReference.get(); BitmapDownloaderTask bitmapDonloaderTask=获取位图下载程序任务(图像视图); //仅当此进程仍与关联时才更改位图 //它 if(this==bitmapDownloaderTask){ imageView.setImageBitmap(位图); //缓存图像 String filename=String.valueOf(url.hashCode()); 文件f=新文件( getCacheDirectory(imageView.getContext()),文件名); imageCache.put(f.getPath(),位图); writeFile(位图,f); } } } } 静态类DownloadedDrawable扩展了ColorDrawable{ 私有最终弱引用<BitmapDownloaderTask>bitmapDonloaderTaskReference; public DownloadedDrawable(位图下载程序任务BitmapDownloaderTask){ super(彩色,白色); bitmapDownloaderTaskReference=新的WeakReference( 位图下载程序任务); } 公共BitmapDownloaderTask获取BitmapDownloaderTask(){ return bitmapDownloaderTaskReference.get(); } } //实际下载代码 静态位图下载位图(字符串url){ HttpParams params=新的BasicHttpParams(); params.setParameter(核心协议PNames.PROTOCOL_VERSION, HttpVersion。 HTTP_1_1); HttpClient客户端=新的DefaultHttp客户端(参数); 最终HttpGet getRequest=新HttpGet(url); 尝试{ HttpResponse响应=client.execute(getRequest); final int statusCode=响应.getStatusLine().getStatus代码(); if(statusCode!=HttpStatus.SC_OK){ Log.w(“ImageDownloader”,“Error”+statusCode +“从”+url“检索位图时); 返回null; } 最终HttpEntity实体=response.getEntity(); if(实体!=空){ InputStream InputStream=null; 尝试{ inputStream=实体.getContent(); 最终位图位图=位图工厂 .decodeStream(inputStream); 返回位图; }最后{ if(inputStream!=null){ inputStream.close(); } entity.consumeContent(); } } }catch(异常e){ //可以为IOException或 //非法状态例外 getRequest.abort(); Log.w(“ImageDownloader”,“从中检索位图时出错” +url+e.toString()); }最后{ if(客户端!=空){ //client.close(); } } 返回null; } }
//其中,第一个是字符串,另一个是要加载的图像视图。 下载ImageTask.getInstance().loadBitmap(avatarURL,iv_avatar);
公共类DownloadImageTask{ 私有LruCache<String,Bitmap>mMemoryCache; /*创建一个单例类以从多个类调用它*/ 私有静态DownloadImageTask实例=null; 公共静态DownloadImageTask getInstance(){ if(实例==空){ instance=新的DownloadImageTask(); } 返回实例; } //从公共实例中锁定构造函数 私人下载ImageTask(){ //获取最大可用VM内存,超过此数量将引发 //OutOfMemory异常。 以KB为单位存储,因为LruCache需要 //int在其构造函数中。 final int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024); //为此内存缓存使用1/8的可用内存。 final int cacheSize=maxMemory/8; mMemoryCache=新LruCache<字符串,位图>(cacheSize){ @覆盖 protected int sizeOf(字符串键,位图位图){ //缓存大小将以KB而不是 //项目数量。 return bitmap.getByteCount()/1024; } }; } public void loadBitmap(String avatarURL,ImageView ImageView){ final String imageKey=String.valueOf(化身URL); 最终位图=getBitmapFromMemCache(imageKey); if(位图!=空){ imageView.setImageBitmap(位图); }其他{ imageView.setImageResource(R.drawable.ic_launcher); new DownloadImageTaskViaWeb(imageView).execute(avatarURL); } } private void addBitmapToMemoryCache(字符串键,位图){ if(getBitmapFromMemCache(key)==空){ mMemoryCache.put(键,位图); } } private位图getBitmapFromMemCache(字符串键){ return mMemoryCache.get(key); } /*打开http流并解码web图像的后台进程*/ 类DownloadImageTaskViaWeb扩展了AsyncTask{ ImageView bmImage; 公共下载ImageTaskViaWeb(ImageView bmImage){ this.bmImage=bmImage; } 受保护的位图doInBackground(字符串…urls){ 字符串urldisplay=urls[0]; 位图mIcon=空; 尝试{ InputStream in=new java.net。 URL(urldisplay).openStream(); mIcon=BitmapFactory.decodeStream(in); } catch(异常e){ Log.e(“错误”,e.getMessage()); e.printStackTrace(); } addBitmapToMemoryCache(String.valueOf(urldisplay),mIcon); 返回mIcon; } /*解码后,我们更新主UI上的视图*/ protected void onPostExecute(位图结果){ bmImage.setImageBitmap(结果); } } }