赞
踩
当我们的ImageView是加载网络的图片时使用下面的方法可以使得我们的代码简单,不用关心网络通信
1.使用Universal_Image_Loader 这个jar包 下载地址:http://download.csdn.net/detail/hewence1/8024329
里面包含jar 跟 源码,根据源码可以自行修改
本节内容转载于:http://blog.csdn.net/vipzjyno1/article/details/23206387
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。
可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置。
GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader ,下载最新的库文件,并且导入到项目的LIB下便可以使用。
该库以及DEMO本地下载链接:下载地址
一、介绍
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。因为已经封装好了一些类和方法。我们 可以直接拿来用了。而不用重复去写了。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面。但是,你也可以参考这个例子来自己写出更好的程序。在此为大家介绍一下:
二、特点
多线程的图像加载
的可能性的宽调谐对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存,显示图像,以及其他)
的图像的可能性中的缓存存储器和/或设备的文件器系统(或SD卡)
可以“听”加载过程中
可自定义每个显示的图像调用分隔的选项
Widget支持
Android 1.5以上支持
简单描述一下这个项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。(别人那边借鉴的这段)
流程图:
三、使用方法
这是 一个开源的Android关于下载显示图片的工具类,在这个下载包里面jar文件,用于我们导入项目使用,具体使用方法在包里面也含有。下面是一个例子:
由于是使用过程中会图片获取要通过网络,并且有缓存设置,所以这2个权限必须要有。
很多人想知道如何设置缓存的目录,可以通过以下方法:
//这个是你希望的缓存文件的目录:imageloader/Cache
之后在ImageLoaderConfiguration的配置文件中通过设置
方法来设置该应用的图片缓存路径。
下面我们就来开始看如何使用这个图片异步加载库把:
一.
先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况。
可以选择在Application中初始化设置该类。
以上的配置看个人需求进行选择,不是所有都要进行配置。
配置好ImageLoaderConfiguration后,调用以下方法来实现初始化:
注:ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是将缓存下来的文件以什么方式命名
里面可以调用的方法有 1.new Md5FileNameGenerator() //使用MD5对UIL进行加密命名
2.new HashCodeFileNameGenerator()//使用HASHCODE对UIL进行加密命名
二.
使用ImageLoader进行图片加载的时候,先要实例化ImageLoader,调用以下方法进行实例化,在每个布局里面都要实例化后再使用。
之后进行显示的图片的各种格式DisplayImageOptions 的设置:
按照你所需要的配置去设置,如果不需要的就可以不做配置。
注:
以上配置中的:
1).imageScaleType(ImageScaleType imageScaleType) 是设置 图片的缩放方式
缩放类型mageScaleType:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2).displayer(BitmapDisplayer displayer) 是设置 图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片
之后按照需求调用
1.纯粹为了加载默认配置的一个图片的
方法:
public void displayImage(String uri, ImageView imageView) {}
具体实现:
2.加载自定义配置的一个图片的
方法:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {}
具体实现:
3.图片加载时候带加载情况的监听
方法:
public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}
ImageLoadingListener 用于监听图片的下载情况。
具体实现:
4.图片加载时候,带监听又带加载进度条的情况
调用:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}
具体实现:
四、注意事项
1.上述提到的2个权限必须加入,否则会出错
2.ImageLoaderConfiguration必须配置并且全局化的初始化这个配置ImageLoader.getInstance().init(config); 否则也会出现错误提示
3.ImageLoader是根据ImageView的height,width确定图片的宽高。
4.如果经常出现OOM(别人那边看到的,觉得很有提的必要)
①减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
下面有人问到如何加载本地图片什么的,之后把那位亲的回答补充上来,谢谢各位大大提出的不足(那时候用的时候只想到用网络图片了,所以也没考虑这么多)。
2.使用Vollery来加载网络图片
下载地址:http://download.csdn.net/detail/hewence1/8024487
里面包含源码跟jar包
本节内容转载于:http://blog.csdn.net/t12x3456/article/details/9221611
1. 什么是Volley
在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley发布了。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
这是Volley名称的由来: a burst or emission of many things or a large amount at once
在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。见下图
其实,从这幅图,我们也可以看出来,Volley特别适合数据量不大但是通信频繁的场景。
1.1. Volley引入的背景
在以前,我们可能面临如下很多麻烦的问题。
比如以前从网上下载图片的步骤可能是这样的流程:
而在Volley下,只需要一个函数即可,详细见后面的例子。
再比如,屏幕旋转的时候,有时候会导致再次从网络取得数据。为了避免这种不必要的网络访问,我们可能需要自己写很多针对各种情况的处理,比如cache什么的。
再有,比如ListView的时候,我们滚动过快,可能导致有些网络请求返回的时候,早已经滚过了当时的位置,根本没必要显示在list里了,虽然我们可以通过ViewHolder来保持url等来实现防止两次取得,但是那些已经没有必须要的数据,还是会浪费系统的各种资源。
1.2. Volley提供的功能
简单来说,它提供了如下的便利功能:
2. 使用前的准备
引入Volley非常简单,首先,从git库先克隆一个下来:
然后编译为jar包,再在自己的工程里import进来。
注意,这个库要求最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。
3.使用例子
下面简单看看如何使用Volley
3.1. 最简单的get请求
这个例子很简单,从网络取得JSON对象,然后打印出来。
3.3. 使用NetworkImageView
Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过
注意,这里使用的不是ImageView控件,而是Volley新提供的com.android.volley.NetworkImageView。
另外,注意这里:
3.5. 使用自己定制的request
我们也可以通过继承Request根据自己的需求来定制自己的request
里面使用的gson(com.google.gson.Gson)是JSON的序列化和反序列化的库,可以在JSON和java model object之间进行转换。
以下是使用自定制request的例子:
4. Volley的架构设计
Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。
主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。如下图:
如果在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,如果Activity被结束了,则我们需要写如下代码作为防守:
Activity被终止之后,如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。
使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。
Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。
比如,可以针对某些个request做取消操作:
5.总结
从演讲的例子来看,Volley应该是简化了网络通信的一些开发,特别是针对如下两种情况:
但是这个东西也有不实用的地方,比如大数据(large payloads ),流媒体,这些case,还需要使用原始的方法,比如Download Manager等。
总之,如果你要编写网络程序,是不是可以考虑开始使用Volley呢?
Universal_Image_Loader里面已经写好了本地存储的方法跟访问的方法,不建议修改
Volley本身不支持本地存储,使用LoadImage要重写ImageCache,也可以使其支持本地存储
- public class BitmapCache implements ImageCache{
- private LruCache<String, Bitmap> mCache;
- @SuppressLint("NewApi")
- public BitmapCache() {
- int maxSize = 10 * 1024 * 1024;
- mCache = new LruCache<String, Bitmap>(maxSize) {
- @Override
- protected int sizeOf(String key, Bitmap value) {
- return value.getRowBytes() * value.getHeight();
- }
-
- };
- }
-
- @SuppressLint("NewApi")
- @Override
- public Bitmap getBitmap(String url) {
- return mCache.get(url);
- }
-
- @SuppressLint("NewApi")
- @Override
- public void putBitmap(String url, Bitmap bitmap) {
- mCache.put(url, bitmap);
- }
-
- }
在
putBitmap的时候自己可以把图片缓存到SD等存储设备中,
在getBitma中如果mCache.get(url)是的空的话,可以访问本地的
那么存的名字可以使用md5加密,这样就可以跟Universal_Image_Loader的逻辑是一样的啦,也支持本地存储的
具体的方法可以参照我前面的博客:http://blog.csdn.net/hewence1/article/details/39157837
Volley支持String跟Json的请求代码很esay
/**
* 解析一个url的内容为 jsonObject
* @param url
*/
private void getVolleryJson(final String url) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
// 设置Tag 方便cancel
jsonObjectRequest.setTag(0);
mQueue.add(jsonObjectRequest);
}
/**
* 显示 的url
* @param url
*/
private void getVolleryString(String url) {
StringRequest stringRequest = new StringRequest(url, new Listener<String>() {
@Override
/**
* url 对应的内容
* @param response
*/
public void onResponse(String response) {
Log.w(TAG , "response ==== > " + response);
}
}, new ErrorListener() {
@Override
/**
* 失败
*/
public void onErrorResponse(VolleyError errorReason) {
Log.e(TAG , "response ==== > " + errorReason.getMessage());
}
});
stringRequest.setTag(0);
mQueue.add(stringRequest);
}
代码下载(包括Universal_Image_Loader跟Volley)的使用:http://download.csdn.net/detail/hewence1/8024669
导入时,因为是本地的服务器,所有运行时请把URL改了
- package com.example.imageloadeddome.data;
-
- public class DataConfig {
- public static final String[] imageUrls = {
- "http://192.168.1.79/test1.png",
- "http://192.168.1.79/test2.png",
- "http://192.168.1.79/test3.png",
- "http://192.168.1.79/test4.png",
- "http://192.168.1.79/test5.png",
- "http://192.168.1.79/test6.png",
- "http://192.168.1.79/test7.png",
- "http://192.168.1.79/test8.png",
- "http://192.168.1.79/test9.png",
- "http://192.168.1.79/test10.png",
- "http://192.168.1.79/test11.png",
- "http://192.168.1.79/test12.png",
- "http://192.168.1.79/test13.png",
- "http://192.168.1.79/test14.png",
- "http://192.168.1.79/test14.png",
- "http://192.168.1.79/test14.png",
- "http://192.168.1.79/test14.png",
- };
-
- public static final String BAIDU_URL = "http://www.baidu.com";
-
- public static final String WEATHER_URL = "http://m.weather.com.cn/data/101010100.html";
- public static final String LOCAL_URL = "http://192.168.1.79/version.xml";
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。