android studio上imageloader初探

文章基于http://blog.csdn.net/xiaanming/article/details/26810303写的,是自己根据博主的博客做了一遍。
直接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();

            }
        });
    }

}

运行效果如图:
android studio上imageloader初探_第1张图片

这是最简单的使用方法,在实际的开发中,我们会面临更复杂的情况,比如在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,开发)