«

使用Unversial-image-loader来异步加载网络图片和本地图片(一)

时间:2024-3-2 18:52     作者:韩俊     分类: Android


现在一个应用最最直观表达意思的就是图片了吧,现在互联网就是以图片加视频的形式主流传播信息,所以图片的显示是如此的重要,最近接触到了一个开源库Universal-Image-Loader,用来异步加载图片的,包括网络上和本地的。

Github项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

它的有点有很多:1.多线程下载图片 2.随意配置图片的参数 3.支持图片的缓存 4.图片下载时的监听 5.根据ImageView的大小自动对图片进行缩小 6.在listView和GridView里滑动屏幕的时候,自动停止加载。。。

总之,这些功能对于一个app的开发简化了很多很多!

下载项目源码后,把universal-image-loader.jar包导入到自己的项目里,这次先学习加载网络图片

Java代码:

加载网络图片

第一步:

// DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态
// (空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,
// 下载完后对图片进行怎么样的处理

DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheOnDisc(true)
// 加载图片时会在磁盘中加载缓存
.cacheInMemory(true)
// 加载图片时会在内存中加载缓存
.displayer(new FadeInBitmapDisplayer(50))
.bitmapConfig(Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY).build();

第二步

// ImageLoaderConfiguration是针对图片缓存的全局配置,
// 主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(
getApplicationContext())
.memoryCache(new UsingFreqLimitedMemoryCache(16 * 1024 * 1024))
.defaultDisplayImageOptions(options).build();
// ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,
// 它有两个具体的方法displayImage、loadImage
ImageLoader.getInstance().init(configuration);


第三步

// ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,
// 它有两个具体的方法displayImage、loadImage
ImageLoader.getInstance().init(configuration);

以上三步是对ImageLoader的设置,基本就是对全部参数的设置

//得到网络图片的url的list名字,然后将参数传递到适配器的构造函数里进行处理,详细代码看后面

mList = initViewData();
WaterFallAdapter adapter = new WaterFallAdapter(mList,
getApplicationContext());
netWorkList.setAdapter(adapter);
netWorkList.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// TODO Auto-generated method stub
// 下拉刷新要做的事

// 刷新完成后记得调用这个
netWorkList.onRefreshComplete();
}

});

接下来我在适配器里面还加入了一些方法

// 得到目标网络地址,刚刚上面传递过来的,然后在displayImage里面传递进去这个参数
String url = list.get(position);
ImageLoader.getInstance().displayImage(url, viewHolder.imageView,
new ImageLoadingListener() {
@Override
public void onLoadingCancelled(String arg0, View arg1) {
// TODO Auto-generated method stub

}
@Override
public void onLoadingComplete(String arg0, View arg1,
Bitmap arg2) {
// TODO Auto-generated method stub
}
@Override
public void onLoadingFailed(String arg0, View arg1,
FailReason reason) {
// TODO Auto-generated method stub
String message;
switch (reason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "can not be decoding";
break;
case NETWORK_DENIED:
message = "Downloads are denied";

break;

case OUT_OF_MEMORY:
message = "内存不足";
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
break;

case UNKNOWN:
message = "未知的错误";
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
break;

}

}

// 开始加载的时候所处理的事
@Override
public void onLoadingStarted(String arg0, View arg1) {
// TODO Auto-generated method stub
viewHolder.imageView.setImageDrawable(drawable);
}

});
viewHolder.imageView.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, "您点击了第" + position + "张图",
Toast.LENGTH_SHORT).show();
}
});


以上步骤就是用Universal-Image-Loader这个控件实现的加载网络图片。对了,别忘了在AndroidManiFest.XML文件里注册权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

因为要下载网络图片并且配置缓存,所以读写权限。

效果图来一张:


这些图片就是我使用这个控件得到的图片,效果还不错,就这样了,下次继续学习这个控件



标签: android

热门推荐