ImageLoader的原理以及定制

Imangeloader相关配置,原理,使用以及定制相关优秀博客推荐

http://blog.csdn.net/vipzjyno1/article/details/23206387
http://www.open-open.com/lib/view/open1433940304473.html
http://www.bubuko.com/infodetail-393997.html
http://www.it165.net/pro/html/201405/14500.html
相关方法调用

Uri uri= Uri.parse(string);//将Stirng 类型的网址转换为Uri

ImageLoader的工作原理是这样的:
在显示图片的时候,它会先在内存中查找;
如果没有,就去本地查找;
如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。

主体有三个,分别是UI控件,缓存模块和数据源(网络)。它们之间的关系如下:

① UI:请求数据,使用唯一的Key值索引Memory Cache中的Bitmap。
② 内存缓存:缓存搜索,如果能找到Key值对应的Bitmap,则返回数据。否则执行第三步。
③ 硬盘存储:使用唯一Key值对应的文件名,检索SDCard上的文件。
④ 如果有对应文件,使用BitmapFactory.decode*方法,解码Bitmap并返回数据,同时将数据写入缓存。如果没有对应文件,执行第五步。
⑤ 下载图片:启动异步线程,从数据源下载数据(Web)。
⑥ 若下载成功,将数据同时写入硬盘和缓存,并将Bitmap显示在UI中。

ImageLoader 的应用

1在APP build.gradle 里的dependencies 里 配置

compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

2在清单文件中声明权限

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

3创建一个 imageUtil类,在里边复制一下代码,initConfigdefult(); 默认 initConfig() 自定义的

public class ImageUtil {

    /**
     * 默认ImageLoaderConfiguration
     */
    public static void initConfigdefult(Context context) {
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .build();
        ImageLoader.getInstance().init(config);
    }

    /**
     * 自定义ImageLoaderConfiguration
     */
    public static void initConfig(Context context) {
        File cacheDir = StorageUtils.getCacheDirectory(context);
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
//  .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
                .diskCacheExtraOptions(480, 800, null)
                .threadPriority(Thread.NORM_PRIORITY - 2)// default
                .tasksProcessingOrder(QueueProcessingType.FIFO)// default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
                .memoryCacheSize(2 * 1024 * 1024)
                .memoryCacheSizePercentage(13)// default
                .diskCache(new UnlimitedDiskCache(cacheDir))// default
                .diskCacheSize(50 * 1024 * 1024)
                .diskCacheFileCount(100)
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())// default
                .imageDownloader(new BaseImageDownloader(context))// default
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())// default
                .writeDebugLogs()
                .build();
        ImageLoader.getInstance().init(config);
    }


    public static DisplayImageOptions initOptions() {
        DisplayImageOptions options = new DisplayImageOptions.Builder()
//图片在网络加载时显示的默认图片
                .showImageOnLoading(R.drawable.hy)// resource or drawable
//图片请求地址为空时显示的默认图片
                .showImageForEmptyUri(R.drawable.ms)// resource or drawable
//图片加载失败时显示的默认图片
                .showImageOnFail(R.drawable.me)// resource or drawable
                .resetViewBeforeLoading(false)// default
                .delayBeforeLoading(1000)
                .cacheInMemory(false)// default
                .cacheOnDisk(false)// default
                .considerExifParams(false)// default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
// default
                .bitmapConfig(Bitmap.Config.ARGB_8888)// default
                .displayer(new SimpleBitmapDisplayer())// default
                .handler(new Handler())// default
                .build();
        return options;
    }


    public static void setImg(String uri, ImageView imageView) {
        ImageLoader.getInstance().displayImage(uri, imageView);
    }

    public static void setImgwithOptions(String uri, ImageView imageView) {
        ImageLoader.getInstance().displayImage(uri, imageView, initOptions());
//参数一层层向外看一只找到初始化位置
    }

}

接下来我们来看看Application类的

public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//以下只可以选择一个、第一个为系统默认,第二个 是自己定义的

//ImageUtil.initConfig(getApplicationContext());
ImageUtil.initConfigdefult(getApplicationContext());
}
}

然后就是MainActivity中调用

public class MainActivity extends AppCompatActivity {
ImageView imageView;
String uri="https://img3.doubanio.com/view/photo/photo/public/p2358629514.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.image);
ImageUtil.setImgwithOptions(uri,imageView);//1 为图片的地址,2 是控件     必须要初始化
}
}

下次目标准备上手Glide
http://blog.csdn.net/qq_19711823/article/details/51243918

就这样吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值