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

android studio上imageloader初探

2015-07-25 19:41 507 查看
文章基于/article/1645774.html写的,是自己根据博主的博客做了一遍。

直接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设定的值来裁剪图片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: