码迷,mamicode.com
首页 > 其他好文 > 详细

Universal-Image-Loader 基本使用

时间:2016-05-03 12:04:40      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:


简介

项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在【内存】中,这种情况下图片会立即显示。
如果需要的图片缓存在【本地】,他们会开启一个独立的线程队列。
如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。
流程图:

技术分享


权限

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


控制OOM
然这个框架有很好的缓存机制,有效的避免了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 和 android:layout_height设定的值,或者android:maxWidth 和/或 android:maxHeight设定的值来裁剪图片。

代码
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView image1 = (ImageView) findViewById(R.id.image1);
        final ImageView image2 = (ImageView) findViewById(R.id.image2);
        final ImageView image3 = (ImageView) findViewById(R.id.image3);
        final ImageView image4 = (ImageView) findViewById(R.id.image4);
        final ImageView image5 = (ImageView) findViewById(R.id.image5);
        final ImageView image6 = (ImageView) findViewById(R.id.image6);
        final ImageView image7 = (ImageView) findViewById(R.id.image7);
        final ImageView image8 = (ImageView) findViewById(R.id.image8);
        final ImageView image9 = (ImageView) findViewById(R.id.image9);
        final ImageView image10 = (ImageView) findViewById(R.id.image10);
        String imageUrl1 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_1.jpg";
        String imageUrl2 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_2.jpg";
        String imageUrl3 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_3.jpg";
        String imageUrl4 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_4.jpg";
        String imageUrl5 = "http://image52.360doc.com/DownloadImg/2012/06/0316/24581213_5.jpg";
        //默认******************************************************************************************
        ImageLoader.getInstance().loadImage(imageUrl1, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {
            }
            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            }
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                image1.setImageBitmap(loadedImage);
            }
            @Override
            public void onLoadingCancelled(String imageUri, View view) {
            }
        });
        //指定图片的大小******************************************************************************************
        ImageSize mImageSize = new ImageSize(300, 300); //可以指定图片的大小
        ImageLoader.getInstance().loadImage(imageUrl2, mImageSize, new SimpleImageLoadingListener() {//缺省适配器SimpleImageLoadingListener
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        image2.setImageBitmap(loadedImage);
                    }
                });
        //配置一些图片显示的选项******************************************************************************************
        DisplayImageOptions options = new DisplayImageOptions.Builder()//显示图片的配置
                .cacheInMemory(true).cacheOnDisk(true)//将图片缓存到内存和硬盘中
                .showImageOnLoading(R.drawable.loading).showImageOnFail(R.drawable.failed)//设置加载中以及图片加载出现错误时显示的图片
                .bitmapConfig(Bitmap.Config.RGB_565).build();
        ImageLoader.getInstance().loadImage(imageUrl3, optionsnew SimpleImageLoadingListener() {
            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                super.onLoadingComplete(imageUri, view, loadedImage);
                image3.setImageBitmap(loadedImage);
            }
        });
        //使用displayImage()加载图片******************************************************************************************
        ImageLoader.getInstance().displayImage(imageUrl4, image4, options);//会根据控件的大小和imageScaleType来自动裁剪图片
        //显示图片下载进度******************************************************************************************
        ImageLoader.getInstance().displayImage(imageUrl5, image5, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {
            @Override
            public void onProgressUpdate(String imageUri, View view, int current, int total) {//得到图片的加载进度
                //    Log.i("bqt", imageUri + "----" + current + "----" + total);
            }
        });
        //加载其他来源的图片,可以是http https file assets drawable content************************************************************
        //sd卡,其中指定的文件可以是视频文件,此工具会自动加载视频的缩略图
        ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(Environment.getExternalStorageDirectory().getPath() + "/a.png"), image6, options);
        ImageLoader.getInstance().displayImage("file:///mnt/sdcard/a.mp4", image7, options);
        //assets
        ImageLoader.getInstance().displayImage("assets://a.png", image8, options);//或使用【Scheme.ASSETS.wrap("a.png")】
        //drawable
        ImageLoader.getInstance().displayImage("drawable://" + R.drawable.a, image9, options);
        //Content provider,可以是视频文件
        ImageLoader.getInstance().displayImage("content://media/external/audio/albumart/a", image10, options);
    }
}

布局
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:orientation="vertical" >
        <ImageView
            android:id="@+id/image6"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image7"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image8"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image9"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image10"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image1"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image2"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image3"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image4"
            style="@style/ImageStyle" />
        <ImageView
            android:id="@+id/image5"
            style="@style/ImageStyle" />
    </LinearLayout>
</ScrollView>

<style name="ImageStyle" >
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">center</item>
        <item name="android:background">#55660077</item>
        <item name="android:layout_margin">5dp</item>
    </style>

Application
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在Application中创建默认的ImageLoaderConfiguration配置参数,并初始化到ImageLoader中
        ImageLoaderConfiguration.Builder configuration = new ImageLoaderConfiguration.Builder(this);
        configuration.diskCacheSize(100 * 1024 * 1024); // 100 MiB
        ImageLoader.getInstance().init(configuration.build());
        // 也可以自己设置配置参数,很多设置在新版中已经被废弃了
        //    initImageLoader(getApplicationContext());
    }
    public static void initImageLoader(Context context) {
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // 打印log信息,Remove for release APP
        ImageLoader.getInstance().init(config.build());
    }
}





Universal-Image-Loader 基本使用

标签:

原文地址:http://www.cnblogs.com/baiqiantao/p/5454210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!