zoukankan      html  css  js  c++  java
  • imageLoader之介绍

    相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListView中的Item有图片的情况中。

    前面与大家分享了一个网络连接框架Retrofit,里面也有类似的图片加载的picasso,大家都可以去体验,直通车:http://www.cnblogs.com/liushilin/p/5680135.html

    当然还有当前我认为最好用的图片缓存加载框架Fresco,直通车:http://www.cnblogs.com/liushilin/p/5659301.html

    大家可能有所不解,为什么有这么好的框架Fresco了,楼主为什么还要分享这个ImageLoader呢?什么鬼。或许大家看法不一样嘛,总之各有各存在的意义,具体就大家自行甄别咯。

     

    项目已同步至:https://github.com/nanchen2251/ImageLoaderDemo

    1)先来看看ImageLoader框架的特征。

    ①多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等

    ②支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置

    ③支持图片的内存缓存,文件系统缓存或者SD卡缓存

    ④支持图片下载过程的监听

    ⑤根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存

    ⑥较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片

    ⑦提供在较慢的网络下对图片进行加载

     

    2)然后要使用它,肯定得添加这个支持包,在studio里面支持直接add,搜索Image-loader即可进行网络添加,需要看它源码的也可以去github网上gank.

    3)先来一个简单使用,加载一张网络图片,只需要两行代码,可见其简单之处。

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:tools="http://schemas.android.com/tools"
     5     android:layout_width="match_parent"
     6     android:layout_height="match_parent"
     7     tools:context="com.example.nanchen.imageloaderdemo.MainActivity">
     8 
     9     <ImageView
    10         android:layout_width="wrap_content"
    11         android:layout_height="wrap_content"
    12         android:src="@mipmap/ic_launcher"
    13         android:id="@+id/main_image"
    14         android:layout_centerInParent="true"/>
    15 </RelativeLayout>
    复制代码

    再看看Activity

    复制代码
    package com.example.nanchen.imageloaderdemo;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ImageView;
    
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
    
    public class MainActivity extends AppCompatActivity {
    
        private String imageUrl = "http://pic.cnblogs.com/face/845964/20160301162812.png";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView imageView = (ImageView) findViewById(R.id.main_image);
            ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));//初始化完成
            ImageLoader.getInstance().displayImage(imageUrl,imageView);
        }
    }
    复制代码

    由于是访问网络图片,所以别忘了添加网络权限

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

      

    运行图:

     

    很简单有木有,不用你去写网络访问,不用你去异步执行,只要两句话,只要两句话!!!

     

    4)当然,你还可以尽情的设置它,上面只是用了简单的Default属性,实际开发中我们可能需要自己按照自己的需求去写它,这里就设置了加载失败显示的图片,还有对于缓存机制的管理等。

    复制代码
     1 //图片展示的管理操作
     2         DisplayImageOptions options = new DisplayImageOptions.Builder()
     3                 .cacheInMemory(true)
     4                 .cacheOnDisk(true)
     5                 .displayer(new RoundedBitmapDisplayer(20))
     6                 .showImageOnFail(R.mipmap.ic_launcher)
     7                 .bitmapConfig(Bitmap.Config.RGB_565)
     8                 .build();
     9 
    10 
    11         //这样自定义设置后就可以管理二级缓存和三级缓存了
    12         ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
    13                 .memoryCacheSizePercentage(20)//设置占用内存的百分比
    14                 .diskCacheFileCount(100)//设置最大下载图片数
    15                 .diskCacheSize(5 * 1024 * 1024)
    16                 .defaultDisplayImageOptions(options)
    17                 .build();
    18 
    19         ImageLoader.getInstance().init(configuration);//初始化完成
    20         ImageLoader.getInstance().displayImage(imageUrl,imageView);
    复制代码

     

    这里还有很多其他的属性啦。

    当然其中使用ImageLoader加载网络图片并不是只有displayImage这个方法的,只是我觉得这是它的方法中相对简单的一种了。

    它其实还有loadImage(),loadImageSync()两种方式,loadImageSync()方法是同步的,android4.0有个特性,网络操作不能在主线程,所以loadImageSync()方法我们就不去使用了。对于另外的方式大家可以自行尝试,不过我的确很推荐上面的方法了。

    4)另外ImageLoader自然也是支持加载sd卡图片和Content provider等,使用起来也比较简单,只需要简单添加两句话即可

    1         String imagePath = "/mnt/sdcard/image.png";
    2         String imageUrl = ImageDownloader.Scheme.FILE.wrap(imagePath);
    3 
    4         ImageLoader.getInstance().init(configuration);//初始化完成
    5         ImageLoader.getInstance().displayImage(imageUrl,imageView);

    5)当然,我相信要使用图片加载框架,更多的人是用ListView和GridView来显示大量的图片,而当我们快速地滑动滚动条的时候,如果同时进行网络加载的话,我们会发现性能大受迎新,那样会出现卡顿情况严重。所以我们应该在滑动的时候不允许加载图片,待滑动结束的时候才加载,这个框架自然少不了这个功能,它提供了PauseOnScrollListner.

    lv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  
    gv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  

    其中的三个参数很简单,第一个是我们的ImageLoader的实例对象,第二个是boolean型参数,需要停止滑动的时候传入一个true,第三个参数控制很快速的滑动的时候图片是否加载。

  • 相关阅读:
    *VC编程规范
    C++的va_start() va_end()函数应用(转)
    * C++类的分解,抽象类与纯虚函数的需要性
    *C++中的回调
    *C++中使用接口
    C++模版使用
    *获取mac地址的方法
    *数字——字符之间的转换(转)
    eclipse雕虫小技一:eclipse打开文件目录
    Hibernate升级后注解方式的对象关系映射
  • 原文地址:https://www.cnblogs.com/awkflf11/p/6608114.html
Copyright © 2011-2022 走看看