Android 图片加载框架ImageLoader

一、特点

    1、多线程下载图片,图片可以来源于网络文件系统,项目文件夹assets中以及drawable中等
    2、支持随意的配置ImageLoader,例如线程池图片下载器内存缓存策略硬盘缓存策略图片显示选项以及其他的一些配置
    3、支持图片的内存缓存文件系统缓存或者SD卡缓存
    4、支持图片下载过程的监听
    5、根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
    6、较好的控制图片的加载过程,例如暂停图片加载重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
    7、提供在较慢的网络下对图片进行加载

 

二、下载地址

https://github.com/nostra13/Android-Universal-Image-Loader

 

三、使用步骤 

    1、导入universal-image-loader-1.9.5.jar到项目中 

          链接:https://pan.baidu.com/s/13HQuqK7cpWsd0B2s16XJ8Q  提取码:4uax 

    2、创建MyApplication继承Application,在oncreate()中初始化ImageLoader
        (1)初始化ImageLoaderConfiguration

        //初始化参数
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
                .threadPriority(Thread.NORM_PRIORITY - 2)                //线程优先级
                .denyCacheImageMultipleSizesInMemory()                   //当同一个url获取不用大小的图片,缓存到内存时,只缓存一个。默认会缓存多个不同的大小的相同图片
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())  //将保存的时候的URI名称用MD5
                .tasksProcessingOrder(QueueProcessingType.FIFO)          //设置图片下载和显示的工作队列排序
                .writeDebugLogs()                                        //打印debug log
                .build();

        (2)ImageLoader全局配置

// 全局初始化此配置
ImageLoader.getInstance().init(configuration);

    3、将创建的MyApplication在AndroidManifest.xml中注册
       
    4、在AndroidManifest.xml中添加联网权限和写sdk权限

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

    5、初始化DisplayImageOptions

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showStubImage(R.drawable.ic_stub)          // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.ic_empty)  // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.ic_error)       // 设置图片加载或解码过程中发生错误显示的图片
                .cacheInMemory(true)                        // 设置下载的图片是否缓存在内存中
                .cacheOnDisk(true)                          // 设置下载的图片是否缓存在SD卡中
                .displayer(new RoundedBitmapDisplayer(20))  // 设置成圆角图片
                .build();                                   // 创建配置过得DisplayImageOption对象

    6、获取ImageLoader实例

ImageLoader imageLoader = ImageLoader.getInstance();

    7、显示加载的图片
        参数1:图片url; 参数2:显示图片的控件; 参数3:显示图片的设置; 参数4:监听器
 imageLoader.displayImage(Constants.IMAGES[position], holder.image, options, mFirstLoadImageListener);

 

四、例子

    1、准备工作(详见使用步骤)
        1)导入universal-image-loader-1.9.5.jar到项目中 
        2)创建MyApplication继承Application,在oncreate()中初始化ImageLoader
            (1)初始化ImageLoaderConfiguration
            (2)ImageLoader全局配置
        3)将创建的MyApplication在AndroidManifest.xml中注册
        4)在AndroidManifest.xml中添加联网权限和写sdk权限
    2、在ListView中加载图片


        (1)初始化布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_margin="5dp"
        android:background="@mipmap/ic_launcher"
        android:layout_width="80dp"
        android:layout_height="80dp" />

    <TextView
        android:id="@+id/content"
        android:layout_margin="5dp"
        android:text="A"
        android:textSize="30sp"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

        (2)初始化listview

<ListView
    android:id="@+id/lv_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.atguigu.android.atguigu.imageloader.ImageloaderListviewActivity">
</ListView>

        (3)初始化适配器

public class ImageloaderListviewAdapter extends BaseAdapter {
    private Context mcontext;
    private DisplayImageOptions options;
    private ImageLoader imageLoader;

    public ImageloaderListviewAdapter(Context context) {
        this.mcontext = context;
        //初始化imageloader
        imageLoader  = ImageLoader.getInstance();
        options = new DisplayImageOptions.Builder()
                .showStubImage(R.drawable.atguigu_logo)                      //设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.atguigu_logo)               //设置图片uri为空或者是错位的时候显示的图片
                .showImageOnFail(R.drawable.atguigu_logo)                    //设置图片加载或解码过程中发生错误显示的图片
                .cacheInMemory(true)                                          //设置下载的图片是否缓存在内存中
                .cacheOnDisk(true)                                            //设置下载的图片是否缓存在SD中
                .displayer( new RoundedBitmapDisplayer(20))//设置成圆角图片
                .build();                                                     //创建配置或的DisplayImageOption对象
    }

    @Override
    public int getCount() {
        return Constants.IMAGES.length;
    }

    @Override
    public Object getItem(int position) {
        return Constants.IMAGES[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(mcontext, R.layout.imageloader_list_content, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.content.setText("text"+position);
        imageLoader.displayImage(Constants.IMAGES[position],viewHolder.icon,options);

        return convertView;
    }


    class ViewHolder {
        @Bind(R.id.icon)
        ImageView icon;
        @Bind(R.id.content)
        TextView content;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}

    3、在GridView中加载图片


        (1)初始化布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.atguigu.android.atguigu.imageloader.ImageloaderGridviewActivity">

    <GridView
        android:id="@+id/gv_mian"
        android:numColumns="3"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </GridView>
</LinearLayout>

        (2)初始化view

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/icon"
        android:background="@mipmap/ic_launcher"
        android:layout_width="100dp"
        android:layout_height="100dp" />

</LinearLayout>

        (3)初始化适配器

public class ImageloaderGridviewAdapter extends BaseAdapter {
    private Context mcontext;
    private ImageLoader imageLoader;
    private DisplayImageOptions options;

    public ImageloaderGridviewAdapter(Context context) {
        this.mcontext = context;
        imageLoader = ImageLoader.getInstance();
        options = new DisplayImageOptions.Builder()
                .showStubImage(R.drawable.atguigu_logo)                      //设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.atguigu_logo)               //设置图片uri为空或者是错位的时候显示的图片
                .showImageOnFail(R.drawable.atguigu_logo)                    //设置图片加载或解码过程中发生错误显示的图片
                .cacheInMemory(true)                                          //设置下载的图片是否缓存在内存中
                .cacheOnDisk(true)                                            //设置下载的图片是否缓存在SD中
                .displayer( new RoundedBitmapDisplayer(20))//设置成圆角图片
                .build();
    }

    @Override
    public int getCount() {
        return Constants.IMAGES.length;
    }

    @Override
    public Object getItem(int position) {
        return Constants.IMAGES[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = View.inflate(mcontext, R.layout.inageloader_grid_content, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        viewHolder = (ViewHolder) convertView.getTag();
        imageLoader.displayImage(Constants.IMAGES[position],viewHolder.icon,options);

        return convertView;
    }


    class ViewHolder {
        @Bind(R.id.icon)
        ImageView icon;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}

    4、在ViewPager中加载图片
        (1)初始化布局

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.atguigu.android.atguigu.imageloader.ImageloaderViewpagerActivity">

<android.support.v4.view.ViewPager
        android:layout_gravity="center"
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v4.view.ViewPager>
</LinearLayout>

        (2)初始化view

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/icon"
        android:background="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

        (3)初始化适配器 

public class ImageloaderViewpagerAdapter extends PagerAdapter{
    private Context mcontext;
    private ImageLoader imageLoader;
    private DisplayImageOptions options;

    public ImageloaderViewpagerAdapter (Context context){
        this.mcontext = context;
        imageLoader = ImageLoader.getInstance();
        options  = new DisplayImageOptions.Builder()
                .showStubImage(R.drawable.atguigu_logo)                      //设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.atguigu_logo)               //设置图片uri为空或者是错位的时候显示的图片
                .showImageOnFail(R.drawable.atguigu_logo)                    //设置图片加载或解码过程中发生错误显示的图片
                .cacheInMemory(true)                                          //设置下载的图片是否缓存在内存中
                .cacheOnDisk(true)                                            //设置下载的图片是否缓存在SD中
                .displayer( new RoundedBitmapDisplayer(20))//设置成圆角图片
                .build();
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = View.inflate(mcontext, R.layout.imageloader_viewpager_content,null);
        ImageView icon = (ImageView) view.findViewById(R.id.icon);
        imageLoader.displayImage(Constants.IMAGES[position],icon,options);

        ((ViewPager)container).addView(view,0);
        return  view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager)container).removeView((View) object);
    }

    @Override
    public int getCount() {
        return Constants.IMAGES.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }
}

五、imageloader 内存溢出解决办法

    1、减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5
    2、在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
    3、在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存
    4、在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值