您的位置:首页 > 移动开发 > Android开发

Android图片加载框架ImageLoader

2016-10-10 18:48 323 查看
平时做项目时,会经常用到加载大量图片的问题,而加载图片时会遇到各种各样的问题,比如:图片错位,OOM等。特别是图片的存储,一直困扰着很多人,因为图片所占的内存较大,很容易出现OOM。接下来介绍一个非常强大的图片加载工具Universal-Image-Loader,该项目在GitHub上面:https://github.com/nostra13/Android-Universal-Image-Loader

该框架的特征:
1、支持多线程下载,图片来源可以是网络,文件系统,ContentProvider,项目文件夹assets和drawable中等。
2、支持随意的配置Imageloader,例如:线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置;
3、支持图片的内存缓存,文件系统缓存和或者SD卡缓存;
4、支持图片下载过程的监听;
5、根据控件(ImageView)对Bitmap进行剪裁,减少Bitmap占用的内存空间;
6、较好的控制图片的加载过程,例如暂停图片的加载,重新考试图片加载,一般使用在ListView和GridView中,滑动过程中暂停,滑动停止后加载;
7、提供在较慢的网络下加载图片
用法:
1、新建一个项目,下载JAR包到libs中;
2、新建一个类AppContext集成Application
public class AppContext extends Application {

@Override
public void onCreate() {
super.onCreate();
/**
* 创建默认的Imageloader配置参数
*/
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.writeDebugLogs()
.build();

ImageLoader.getInstance().init(configuration);
}
}

3、ImageLoaderConfiguration是图片加载器ImageLoader的配置参数,使用了建造者模式,这里是直接使用了createDefault()方法创建一个默认的ImageLoaderConfiguration,当然我们还可以自己设置ImageLoaderConfiguration,,一般使用createDefault()创建的ImageLoaderConfiguration就能使用,然后调用ImageLoader的init()方法将ImageLoaderConfiguration参数传递进去,ImageLoader使用单例模式。
4、加权限管理:

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

5、接下来就可以加载图片了,首先Xml文件:

<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher"/>

6、图片的加载:有两种方式,LoadImage和displayImage,通常情况下使用diaplayImage,配置比较简单,一句话就可以:

private ImageView mImageView;
private String imageUrl = "http://macprovid.vo.llnwd.net/o43/hub/media/1090/6882/01_headline_Muse.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mImageView = (ImageView) findViewById(R.id.image);
}

public void btnClick(View view){

ImageSize imageSize = new ImageSize(200,200);

/**
* 图片显示的配置
*/

DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher)
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();

ImageLoader.getInstance().displayImage(imageUrl,mImageView,options);

}
}

OutOfMemoryError

虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?
减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5
在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存
在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)
通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width
and android:layout_height设定的值,或者android:maxWidth and/or android:maxHeight设定的值来裁剪图片

参考来源(请尊重原创):http://blog.csdn.net/xiaanming/article/details/26810303
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: