当我们的ImageView是加载网络的图片时使用下面的方法可以使得我们的代码简单,不用关心网络通信
1.使用Universal_Image_Loader 这个jar包 下载地址:
里面包含jar 跟 源码,根据源码可以自行修改
本节内容转载于:
这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。
可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置。
GITHUB上的下载路径为: ,下载最新的库文件,并且导入到项目的LIB下便可以使用。
该库以及DEMO本地下载链接:下载地址
一、介绍
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。因为已经封装好了一些类和方法。我们 可以直接拿来用了。而不用重复去写了。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面。但是,你也可以参考这个例子来自己写出更好的程序。在此为大家介绍一下:
二、特点
多线程的图像加载
的可能性的宽调谐对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存,显示图像,以及其他)
的图像的可能性中的缓存存储器和/或设备的文件器系统(或SD卡)
可以“听”加载过程中
可自定义每个显示的图像调用分隔的选项
Widget支持
Android 1.5以上支持
简单描述一下这个项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。(别人那边借鉴的这段)
流程图:
三、使用方法
这是 一个开源的Android关于下载显示图片的工具类,在这个下载包里面jar文件,用于我们导入项目使用,具体使用方法在包里面也含有。下面是一个例子:
[java] view plain copy
由于是使用过程中会图片获取要通过网络,并且有缓存设置,所以这2个权限必须要有。
很多人想知道如何设置缓存的目录,可以通过以下方法:
[java] view plain copy
//这个是你希望的缓存文件的目录:imageloader/Cache
之后在ImageLoaderConfiguration的配置文件中通过设置
方法来设置该应用的图片缓存路径。
下面我们就来开始看如何使用这个图片异步加载库把:
一.
先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况。
可以选择在Application中初始化设置该类。
[java] view plain copy 以上的配置看个人需求进行选择,不是所有都要进行配置。
配置好ImageLoaderConfiguration后,调用以下方法来实现初始化:
[java] view plain copy 注:ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是将缓存下来的文件以什么方式命名
里面可以调用的方法有 1.new Md5FileNameGenerator() //使用MD5对UIL进行加密命名
2.new HashCodeFileNameGenerator()//使用HASHCODE对UIL进行加密命名
二.
使用ImageLoader进行图片加载的时候,先要实例化ImageLoader,调用以下方法进行实例化,在每个布局里面都要实例化后再使用。
[java] view plain copy之后进行显示的图片的各种格式DisplayImageOptions 的设置:
[java] view plain copy
按照你所需要的配置去设置,如果不需要的就可以不做配置。
注:
以上配置中的:
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) {}
具体实现:
[java] view plain copy
2.加载自定义配置的一个图片的
方法:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) {}
具体实现:
3.图片加载时候带加载情况的监听
方法:
public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageLoadingListener listener) {}
ImageLoadingListener 用于监听图片的下载情况。
具体实现:
[java] view plain copy
4.图片加载时候,带监听又带加载进度条的情况
调用:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {}
具体实现:
[java] view plain copy
四、注意事项
1.上述提到的2个权限必须加入,否则会出错
2.ImageLoaderConfiguration必须配置并且全局化的初始化这个配置Instance().init(config); 否则也会出现错误提示
3.ImageLoader是根据ImageView的height,width确定图片的宽高。
4.如果经常出现OOM(别人那边看到的,觉得很有提的必要)
①减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
②使用.fig.RGB_565)代替ARGB_8888;
③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
下面有人问到如何加载本地图片什么的,之后把那位亲的回答补充上来,谢谢各位大大提出的不足(那时候用的时候只想到用网络图片了,所以也没考虑这么多)。
2.使用Vollery来加载网络图片
下载地址:
里面包含源码跟jar包
本节内容转载于:
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库先克隆一个下来:
[java] view plain copy
然后编译为jar包,再在自己的工程里import进来。
注意,这个库要求最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。
3.使用例子
下面简单看看如何使用Volley
3.1. 最简单的get请求
这个例子很简单,从网络取得JSON对象,然后打印出来。
[java] view plain copy
3.3. 使用NetworkImageView
Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过
[java] view plain copy[java] view plain copy
注意,这里使用的不是ImageView控件,而是Volley新提供的com.android.volley.NetworkImageView。
另外,注意这里:
[java] view plain copy[java] view plain copy
.java
3.5. 使用自己定制的request
我们也可以通过继承Request根据自己的需求来定制自己的request
[java] view plain copy
里面使用的gsonle.gson.Gson)是JSON的序列化和反序列化的库,可以在JSON和java model object之间进行转换。
以下是使用自定制request的例子:
[java] view plain copy4. Volley的架构设计
Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。
主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。如下图:
如果在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,如果Activity被结束了,则我们需要写如下代码作为防守:
[java] view plain copy
Activity被终止之后,如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。
使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。
Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。
比如,可以针对某些个request做取消操作:
[java] view plain copy
[java] view plain copy
[java] view plain copy
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) {@Overrideprotected int sizeOf(String key, Bitmap value) {RowBytes() * Height();}};}@SuppressLint("NewApi")@Overridepublic Bitmap getBitmap(String url) {(url);}@SuppressLint("NewApi")@Overridepublic void putBitmap(String url, Bitmap bitmap) {mCache.put(url, bitmap);}}
在
putBitmap的时候自己可以把图片缓存到SD等存储设备中,
在getBitma中如果(url)是的空的话,可以访问本地的
那么存的名字可以使用md5加密,这样就可以跟Universal_Image_Loader的逻辑是一样的啦,也支持本地存储的
具体的方法可以参照我前面的博客:
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", String());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", Message(), 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 ==== > " + Message());
}
});
stringRequest.setTag(0);
mQueue.add(stringRequest);
}
代码下载(包括Universal_Image_Loader跟Volley)的使用:
导入时,因为是本地的服务器,所有运行时请把URL改了
ample.imageloadeddome.data;public class DataConfig {public static final String[] imageUrls = {"192.168.1.79/test1.png","192.168.1.79/test2.png","192.168.1.79/test3.png","192.168.1.79/test4.png","192.168.1.79/test5.png","192.168.1.79/test6.png","192.168.1.79/test7.png","192.168.1.79/test8.png","192.168.1.79/test9.png","192.168.1.79/test10.png","192.168.1.79/test11.png","192.168.1.79/test12.png","192.168.1.79/test13.png","192.168.1.79/test14.png","192.168.1.79/test14.png","192.168.1.79/test14.png","192.168.1.79/test14.png",};public static final String BAIDU_URL = "";public static final String WEATHER_URL = ".html";public static final String LOCAL_URL = "192.168.1.l";
}
本文发布于:2024-01-28 16:52:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064319758872.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |