ImageLoader异步加载图片框架浅谈

相信大家平时做Android应用的时候,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于新手来说,这些问题解决起来会比较吃力,所以就有很多的开源图片加载框架应运而生,比较著名的就是Universal-Image-Loader。我见到说一下


在继承Application的类中配置

package com.hy.jj.android.application;

import java.io.File;

import com.example.androidelx.R;
import com.hy.jj.android.common.Common;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;

public class ElxApplication extends Application {

    
    @Override
    public void onCreate() {
        super.onCreate();
        initImageLoader(getApplicationContext());
    }
    
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        
        ImageLoader.getInstance().clearMemoryCache();
    }
    
    public static void initImageLoader(Context context) {

        File cacheDir = new File(Common.IMAGE_FILE_PATH + "/cache");
        if(!cacheDir.exists()){
            cacheDir.mkdirs();
        }
        
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        
        config.threadPoolSize(3); // default  线程池内加载的数量
        config.threadPriority(Thread.NORM_PRIORITY - 2);//设置当前线程的优先级
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());//将保存的时候的URI名称用MD5 加密
        config.diskCacheSize(100 * 1024 * 1024); // 50 Mb sd卡(本地)缓存的最大值
        config.diskCacheFileCount(500);  // sd卡可以缓存的文件数量
        config.memoryCacheSize(2 * 1024 * 1024);// 内存缓存的最大值
        config.memoryCache(new WeakMemoryCache());//禁用内存缓存
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app
        config.diskCacheExtraOptions(480, 320, null);
        config.diskCache(new UnlimitedDiskCache(cacheDir));//自定义缓存到本地路径
        ImageLoader.getInstance().init(config.build());
    }
    
    public DisplayImageOptions initDisplayImageOptions() {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                // 设置图片在下载期间显示的图片
                .showImageOnLoading(R.drawable.icon_stub)
                // 设置图片Uri为空或是错误的时候显示的图片
                .showImageForEmptyUri(R.drawable.icon_empty)
                // 设置图片加载/解码过程中错误时候显示的图片
                .showImageOnFail(R.drawable.icon_error)
                // 设置下载的图片是否缓存在内存中
                .cacheInMemory(false)
                // 设置下载的图片是否缓存在SD卡中
                .cacheOnDisk(true)
                .considerExifParams(true)
                // 设置图片的缩放方式
                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
                // 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565)
                .displayer(new RoundedBitmapDisplayer(0)).build();//设置圆角
        /*
         * EXACTLY :图像将完全按比例缩小的目标大小
         * EXACTLY_STRETCHED:图片会缩放到目标大小完全
         * IN_SAMPLE_INT:图像将被二次采样的整数倍
         * IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
         * NONE:图片不会调整
         */

        return options;
    }
    
    /**
     * 下面有人问到如何加载本地图片什么的,之后把那位亲的回答补充上来,谢谢各位大大提出的不足(那时候用的时候只想到用网络图片了,所以也没考虑这么多)。

        String imageUri = "http://site.com/image.png"; // from Web  
        String imageUri = "file:///mnt/sdcard/image.png"; // from SD card  
        String imageUri = "content://media/external/audio/albumart/13"; // from content provider  
        String imageUri = "assets://image.png"; // from assets  
        String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
     * */
}

//在需要图片异步加载的类中使用

private ElxApplication application = (ElxApplication) getApplication();

private ImageLoader imageLoader = ImageLoader.getInstance();

private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();//图片加载的监听


//在需要加载的地方

imageLoader.displayImage(link, img,  application.initDisplayImageOptions() , animateFirstListener);


private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view,
                Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
              //做些事情
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值