- 浏览: 11525 次
- 性别:
- 来自: 邯郸市
文章分类
最新评论
如上节,有时候需要显示网络图片,QListView的Item中或其他地方。写一个类负责将网络图片下载下来,供使用。
原理很简单,当有图片下载请求时,就新建一个线程去从网络中获取数据,并存放到一个Map中,下载完成时使用Handler去通知并在回调函数中返回图片数据。
Map使用图片的网络路径作为索引,存放图片数据Drawable,将下载好的图片数据加入到最后,并判断总数超出限制数量则将最前的去除。
为了避免一次请求图片过多,新建的线程过多,使用ThreadPoolExecutor进行管理。
加载图片的方法loadImage()传入网络图片路径、加载完毕的监听器,及两个其他参数(会在回调函数中附带,解决ListView Item中图片错位的问题)。
具体下载图片数据则直接使用Drawable.createFromStream生成Drawable。
使用如下:
效果可以用一个ImageView试一下,之后会在QListView中使用。
public class ImageLoad { private Context context; private Map<String, Drawable> imageMap; private ThreadPoolExecutor executor = null; BlockingQueue<Runnable> queue =null; private String path=Environment.getExternalStorageDirectory()+"/Dp Notes/Cache/PreImage"; private int threadMaxNum=Runtime.getRuntime().availableProcessors()>1?Runtime.getRuntime().availableProcessors():2; private int cacheMaxNum=1; private Drawable errorDrawable,loadingDrawable; @SuppressLint("NewApi") public ImageLoad(Context context){ this.context=context; imageMap=new LinkedHashMap<String, Drawable>(); queue =new ArrayBlockingQueue<Runnable>(this.threadMaxNum); executor=new ThreadPoolExecutor(this.threadMaxNum,this.threadMaxNum,1,TimeUnit.MINUTES,queue,new ThreadPoolExecutor.CallerRunsPolicy()); errorDrawable=context.getResources().getDrawable(R.drawable.ic_launcher); loadingDrawable=context.getResources().getDrawable(R.drawable.ic_launcher); // File dir=new File(this.path); // if(!dir.exists()){ // dir.mkdirs(); // } } public void setcacheMaxNum(int maxNum){ this.cacheMaxNum=maxNum; } public Drawable loadImage(final View viewParent,final int viewTag,final String imageUrl,final ImageLoadCallback callback){ if (imageMap.containsKey(imageUrl)) { Drawable drawable=imageMap.get(imageUrl); if(drawable==null){ return loadingDrawable; } else if(drawable!=errorDrawable){ return drawable; } } // int index=imageUrl.lastIndexOf("/"); // index=index>=0?index:0; // String filename=imageUrl.substring(index); // final String filepath=path+filename+".0"; // // final File mf=new File(filepath); // if(mf.exists()){ // Bitmap bitmap=BitmapFactory.decodeFile(filepath); // BitmapDrawable draw=new BitmapDrawable(context.getResources(),bitmap); // if(draw!=null){ // imageMap.put(imageUrl,draw); // chackMapSize(); // return draw; // } // } imageMap.put(imageUrl,null); final Handler handler = new Handler() { @SuppressLint("HandlerLeak") public void handleMessage(Message message) { if(callback!=null){ if(message.what==1){ callback.onSuccess((Drawable) message.obj,viewTag,viewParent); } } } }; executor.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub URL url = null; InputStream inputStream = null; try { url = new URL(imageUrl); inputStream = url.openStream(); Drawable drawable = Drawable.createFromStream(inputStream, "src"); Message message; if(drawable==null){ drawable=errorDrawable; } message=handler.obtainMessage(1,drawable); handler.sendMessage(message); imageMap.put(imageUrl,drawable); chackMapSize(); // if(drawable!=errorDrawable){ // try { // if(!mf.exists()){ // try { // mf.createNewFile(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } // FileOutputStream fout=new FileOutputStream(mf); // Bitmap bitmap=((BitmapDrawable)drawable).getBitmap(); // bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); // } catch (FileNotFoundException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } } catch (Exception e) { e.printStackTrace(); } finally { try { if (inputStream != null) inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }); return loadingDrawable; } private void chackMapSize(){ if(imageMap.size()>cacheMaxNum){ for(Entry<String, Drawable> m:imageMap.entrySet()){ imageMap.remove(m.getKey()); break; } } } public interface ImageLoadCallback { public void onSuccess(Drawable drawable,int tag,View viewParent); } }
原理很简单,当有图片下载请求时,就新建一个线程去从网络中获取数据,并存放到一个Map中,下载完成时使用Handler去通知并在回调函数中返回图片数据。
Map使用图片的网络路径作为索引,存放图片数据Drawable,将下载好的图片数据加入到最后,并判断总数超出限制数量则将最前的去除。
为了避免一次请求图片过多,新建的线程过多,使用ThreadPoolExecutor进行管理。
加载图片的方法loadImage()传入网络图片路径、加载完毕的监听器,及两个其他参数(会在回调函数中附带,解决ListView Item中图片错位的问题)。
具体下载图片数据则直接使用Drawable.createFromStream生成Drawable。
使用如下:
private ImageLoad imgload; //定义类对象 imgload=new ImageLoad(activity); //构建 //合适的地方启动加载: Drawable pre=imgload.loadImage(viewparent,tagpre,data.preurl,ilcallback); if(drawable!=null){ holder.rl_data.setBackground(pre); } private ImageLoadCallback ilcallback=new ImageLoadCallback() { @SuppressLint("NewApi") @Override public void onSuccess(Drawable drawable, int tag, View viewParent) { // TODO Auto-generated method stub if(drawable!=null){ holder.rl_data.setBackground(drawable); } } };
效果可以用一个ImageView试一下,之后会在QListView中使用。
人定胜天——2017/05/21
发表评论
-
20、长图的加载显示
2017-06-18 16:24 590有时候图片很长,预览只是其一部分,有个类似按钮 ... -
19、GIF动图显示
2017-06-18 16:28 833有时候需要显示动图,可安卓有没有现成的控件,很 ... -
18、ListView显示图片
2017-06-18 16:23 514ListView显示 ... -
15、ListView Item设置
2017-06-17 20:52 508当然想要ListView显示自定义的布局,显示 ... -
16、后台异步处理
2017-06-17 20:56 665大多时候,需要后台(异步)去执行一些费时操作。 ... -
14、自定义ListView
2017-06-13 22:05 718实现了显示的效果,接着来实现一些监听器(接口) ... -
13、自定义ListView
2017-06-13 21:58 545下拉刷新,上拉加载,很流行的啊,总的来说有两种 ... -
12、Dp Notes内容-列表(ListView使用)
2017-06-12 22:48 504完成了一些空架子,开始填内容,从列表开始吧(主 ... -
11、Dp Notes顶部导航栏
2017-06-10 23:05 498完成了底部导航栏,再来顶部导航栏(叫什么?菜单 ... -
10、Dp Notes底部导航栏
2017-06-10 11:48 549有卡顿的现象(可能模拟器原因),滑动时没有渐变 ... -
9、Dp Notes底部导航栏
2017-06-10 11:41 549将ViewPager和QEndBar结合起来, ... -
8、Dp Notes底部导航栏
2017-06-07 21:59 644实现了点击切换效果(只是图标状态变化),如何结 ... -
7、Dp Notes底部导航栏
2017-06-07 21:58 570想要的图标呢?怎么弄上去。从网上找了几个图标, ... -
6、Dp Notes底部导航栏(自定义控件(View))
2017-06-05 21:40 626已经看到了安卓的一角,正式开始Dp Notes ... -
5、控件美化(drawable使用)
2017-06-04 11:19 663先前的回复页面虽然搭好了,功能也实现了,但页面 ... -
4、第一行代码
2017-06-03 09:12 656上节完成了回复功能的页面搭建,可是想要的功能并 ... -
3、基本控件
2017-06-03 09:01 545控件,很好 ... -
2、你好,世界
2017-06-01 20:23 492开发一个安 ... -
1、初衷
2017-05-31 21:18 390接触安卓已经有一段时间了,从一开始接触J2M ...
相关推荐
在移动应用开发中,"app启动动画"与"网络图片加载"是两个至关重要的概念,它们不仅提升用户体验,还能在一定程度上展现应用的品牌形象。本文将深入探讨这两个主题,为初学者提供详尽的指导。 首先,我们来讨论启动...
这个“Unity 网络图片加载与本地图片读取demo”显然是一个示例项目,旨在教导开发者如何从网络上获取图片并将其显示在Unity场景中,同时也能处理本地存储的图片。以下将详细介绍这两个核心知识点: ### 1. 网络图片...
在Android开发中,网络图片加载是一项常见的任务,特别是在构建用户界面和移动应用时。本教程将深入探讨如何在Android中实现网络图片的加载,以"android开发之网络图片加载"为主题,结合真机测试可用的DEMO进行讲解...
这个压缩包文件包含了关于Android中常见的网络图片加载库及其缓存机制的示例代码,旨在帮助开发者理解和实现高效的图片加载策略。以下是一些核心知识点的详细说明: 1. **异步加载**:Android UI线程不应承担繁重的...
4. **网络图片加载**:在Android中,直接加载网络图片会涉及到IO操作和网络请求,一般会使用异步加载机制。可以使用HttpURLConnection、OkHttp等网络库进行网络请求,然后通过BitmapFactory.decodeStream()解析流为...
前提:插件已经被贪婪龙作者修改和优化过,不需要用到的代码都被注释掉了。 ...使用说明:需要将Uni Gif Image脚本挂在RawImage组件对象身上,需要...使用方法非常简单,支持网络加载全格式的图片,也可以加载本地图片。
2. **网络图片加载库** 有许多成熟的第三方库可以帮助我们实现这一目标,例如: - **Universal Image Loader (UIL)**:一个强大的图片加载、缓存库,支持多种定制选项。 - **Picasso**:由Square公司开发,简单...
在移动应用开发中,异步加载网络图片是一个关键的技术点,尤其在数据密集型的应用如社交媒体、电商等中,为了提供良好的用户体验,避免用户等待图片加载,开发者通常会采用异步加载策略。本文将深入探讨这个主题,...
1. **创建一个图片加载库**:Android有许多成熟的第三方库,如 Glide、Picasso、Fresco 和 Universal Image Loader 等,它们都提供了方便的API来处理网络图片加载。以Glide为例,我们可以用简洁的代码将图片加载到...
【网络图片加载】是移动应用开发中的一个关键环节,它涉及到如何高效地获取、存储和显示网络上的图像资源。在Android或iOS应用中,网络图片加载的实现通常是为了优化用户体验,减少流量消耗,并确保界面流畅。本文将...
本篇文章将详细介绍ImageLoader库的使用,以及它在网络图片加载和缓存方面的工作原理。 一、ImageLoader库介绍 ImageLoader库是由俄罗斯开发者Dmitry Malkovich创建的,它提供了强大的图片加载、缓存和显示功能。库...
对于网络图片加载,我们可以使用第三方库,如Glide、Picasso或Fresco,它们都提供了便捷的方法来处理网络图片的加载、缓存和显示。 1. **Glide**:Glide是一个高效的图片加载库,它支持图片的缩放、裁剪以及占位符...
为了实现网络图片加载功能,可以创建一个自定义的`AnyImageView`类,继承自`Sprite`。这个类将包含网络请求逻辑,并在图片数据加载完成后,使用`Sprite::createWithImage()`或`Sprite::createWithSpriteFrameName()...
在Android应用开发中,图片加载是一项常见的任务,尤其是在处理大量图片或者网络图片时,为了提供良好的用户体验,我们通常会采用异步加载的方式。本篇将深入探讨Android平台上的图片异步加载策略,以及如何加载网络...
ImageLoader是一款广泛应用于Android开发中的图片加载库,它旨在高效、稳定地加载网络图片到应用中,同时提供了缓存机制,以改善用户体验。在Android应用中,由于网络环境的不稳定性,图片加载是一个常见的挑战,...
本示例将详细介绍如何使用最简洁的C#代码动态加载网络图片到一个`Image`控件中,这对于创建用户界面时展示远程图片至关重要。 首先,我们需要了解WPF中的`Image`控件。`Image`控件是WPF提供的用于显示图像的基本...
然而,当这个列表包含网络图片时,就会出现一些挑战。"ListView加载网络图片"这个主题涉及到如何有效地在ListView的每个Item中加载和显示从互联网获取的图像,同时保持性能和用户体验。 在描述中提到,提供的代码...
在Android开发中,图片加载和缓存是一个非常重要的环节,特别是在使用ViewPager进行滑动展示大量网络图片时。这个“安卓图片加载缓存相关-ViewPager动态加载网络图片.rar”压缩包可能包含了一些示例代码,帮助开发者...
因此,对于网络图片加载这种可能耗时的任务,我们需要在后台线程进行。 1. **AsyncTask**: Android提供了一个内置的类`AsyncTask`,它可以方便地在后台线程执行任务,并在完成时更新UI。创建一个自定义的`AsyncTask...
在Android应用开发中,有效地加载和管理网络图片是一项常见的任务,尤其在构建用户界面时。ImageLoader是一个流行的图片加载库,它提供了强大的功能,如缓存、内存管理以及线程控制,以确保高效的图片加载体验。本文...