android studio上imageloader初探
2015-07-25 19:41
507 查看
文章基于/article/1645774.html写的,是自己根据博主的博客做了一遍。
直接show the code。
1.先导入jar包,如果不会的童鞋请自行百度
2.首先配置一个MyApplication继承application
ImageLoaderConfiguration 是进行imageloader的配置使用,我是用的是默认的配置,你也可以自己设定配置
然后在mainfest文件中设置application属性name=” 你自定义的application名字”
加上权限
主activity代码:
运行效果如图:
这是最简单的使用方法,在实际的开发中,我们会面临更复杂的情况,比如在listview加载图片,我们不能每刷新一次
就从网上下载一次,这样做是很浪费内存的,所以,imageloader里面有一个方法:DisplayImageOptions,我们可以根据自己的需求设置它,比如缓存的方式等等。
上面是官方给出的使用方法,然后我自己依照官方demo改了一些参数,结果如下
然后将options传入到loadImage里面(4个参数),就可以轻松实现缓存的功能啦。
ImageLoader.getInstance().loadImage(imageUrl, imageSize,options,new ImageLoadingListener(){…};
其实imageloader里面给我们提供了一个更简单的方法去加载图片:displayImage
DisplayImageOptions options=new DisplayImageOptions.Builder().
showImageOnLoading(R.drawable.abc_btn_check_material).
showImageOnFail(R.drawable.notification_template_icon_bg).
cacheInMemory(true).
cacheOnDisk(true).build();
final ImageView imageView= (ImageView) findViewById(R.id.image);
ImageLoader.getInstance().displayImage(imageUrl,imageView,options);
直接调用loadimage进行图片的使用~,更快更高更强~,我们不用写ImageLoadingListener,也不用手动设置imageview显示Bitmap,他也会自行根据控件的大小和imageScaleType来自动裁剪图片。
如果想要实现监听下载进度的功能,loadImage也能做到,只要添加一个ImageLoadingProgressListener参数的方法都有带ImageLoadingListener参数,所以这里直接new 一个SimpleImageLoadingListener,然后我们就可以在回调方法onProgressUpdate()得到图片的加载进度。
如果你想加载SD或者内容提供者的图片,你可以直接修改图片url就行
这是SD卡上的,不同的获取途径只要调用对应的Scheme的方法就行~
相信大部分人都是使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式
第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载.
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设定的值来裁剪图片
直接show the code。
1.先导入jar包,如果不会的童鞋请自行百度
2.首先配置一个MyApplication继承application
public class MyApplictation extends Application { @Override public void onCreate() { super.onCreate(); //创建默认的imageloader配置函数 ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this); //初始化imageloader ImageLoader.getInstance().init(configuration); } }
ImageLoaderConfiguration 是进行imageloader的配置使用,我是用的是默认的配置,你也可以自己设定配置
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)....
然后在mainfest文件中设置application属性name=” 你自定义的application名字”
加上权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> </uses-permission> <uses-permission android:name="android.permission.INTERNET"> </uses-permission>
主activity代码:
package app.imageloader; import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageSize; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; public class MainActivity extends AppCompatActivity { private String imageUrl="http://pic.nipic.com/2007-11-09/2007119121849495_2.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ImageView imageView= (ImageView) findViewById(R.id.image); //可以自己设置图片大小 ImageSize imageSize=new ImageSize(200,200); //imageloader采用的是单例的模式,通过getInstance()获取实例 //loadimage方法加载图片,传入urlstring以及一个下载监听匿名类 ImageLoader.getInstance().loadImage(imageUrl, imageSize,new ImageLoadingListener() { @Override public void onLoadingStarted(String s, View view) { Toast.makeText(MainActivity.this,"下载开始",Toast.LENGTH_SHORT).show(); } @Override public void onLoadingFailed(String s, View view, FailReason failReason) { Toast.makeText(MainActivity.this,"下载失败",Toast.LENGTH_SHORT).show(); } //监听下载完成 @Override public void onLoadingComplete(String s, View view, Bitmap bitmap) { imageView.setImageBitmap(bitmap); } @Override public void onLoadingCancelled(String s, View view) { Toast.makeText(MainActivity.this,"下载取消",Toast.LENGTH_SHORT).show(); } }); } }
运行效果如图:
这是最简单的使用方法,在实际的开发中,我们会面临更复杂的情况,比如在listview加载图片,我们不能每刷新一次
就从网上下载一次,这样做是很浪费内存的,所以,imageloader里面有一个方法:DisplayImageOptions,我们可以根据自己的需求设置它,比如缓存的方式等等。
DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_error) // 设置图片加载或解码过程中发生错误显示的图片 .resetViewBeforeLoading(false) // default 设置图片在加载前是否重置、复位 .delayBeforeLoading(1000) // 下载前的延迟时间 .cacheInMemory(false) // default 设置下载的图片是否缓存在内存中 .cacheOnDisk(false) // default 设置下载的图片是否缓存在SD卡中 .preProcessor(...) .postProcessor(...) .extraForDownloader(...) .considerExifParams(false) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.ARGB_8888) // 设置图片的解码类型 .decodingOptions(...) // 图片的解码设置 .displayer(new SimpleBitmapDisplayer())//还可以设置圆角图片new RoundedBitmapDisplayer(20) .handler(new Handler()) // default .build();
上面是官方给出的使用方法,然后我自己依照官方demo改了一些参数,结果如下
DisplayImageOptions options=new DisplayImageOptions.Builder(). cacheInMemory(true). cacheOnDisk(true).build();
然后将options传入到loadImage里面(4个参数),就可以轻松实现缓存的功能啦。
ImageLoader.getInstance().loadImage(imageUrl, imageSize,options,new ImageLoadingListener(){…};
其实imageloader里面给我们提供了一个更简单的方法去加载图片:displayImage
DisplayImageOptions options=new DisplayImageOptions.Builder().
showImageOnLoading(R.drawable.abc_btn_check_material).
showImageOnFail(R.drawable.notification_template_icon_bg).
cacheInMemory(true).
cacheOnDisk(true).build();
final ImageView imageView= (ImageView) findViewById(R.id.image);
ImageLoader.getInstance().displayImage(imageUrl,imageView,options);
直接调用loadimage进行图片的使用~,更快更高更强~,我们不用写ImageLoadingListener,也不用手动设置imageview显示Bitmap,他也会自行根据控件的大小和imageScaleType来自动裁剪图片。
如果想要实现监听下载进度的功能,loadImage也能做到,只要添加一个ImageLoadingProgressListener参数的方法都有带ImageLoadingListener参数,所以这里直接new 一个SimpleImageLoadingListener,然后我们就可以在回调方法onProgressUpdate()得到图片的加载进度。
imageLoader.getInstance.displayImage(imageUrl, mImageView, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { } });
如果你想加载SD或者内容提供者的图片,你可以直接修改图片url就行
这是SD卡上的,不同的获取途径只要调用对应的Scheme的方法就行~
String imagePath = "/mnt/sdcard/111111.png"; String imageUrl = Scheme.FILE.wrap(imagePath);
相信大部分人都是使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling)); gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载.
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设定的值来裁剪图片
相关文章推荐
- 深入剖析Android四大组件(一)——Activity生命周期详解
- 关于Android四大组件的学习总结
- Android 那些你所不知道的Bitmap对象详解
- Android 限制只输入某些值包括数字、字母等
- Android 解析AsyncTask(一)
- 关于android中layout_gravity和gravity对View的影响
- Android Studio快捷键大全
- Android高效布局
- 如何修改Android系统的版本号
- Android获得Manifest在<meta-data>元件的值
- Android四大组件之BroadcastReceveier
- android基础:获取GPS定位简单实例
- android5.0 Activity transition
- Android中ListView使用
- android studio删除module
- 解决Android代码中遇到高版本API的错误提示
- Android 01:AutoCompleteTextView-简单实现实现自动输入文本效果
- Android.9图片评论(一个)
- Android的四种启动模式
- Android开发之使用AsyncTask实现实时翻译