自定义Gilde的使用与解释

例子

  1. Gilde控件是一个图片加载的一个工具。优点性能高,流式api。使用例子是如下
LDGlide.with(this).load("http://url").loading(R.mipmap.ic_launcher).listener(new RequestListener() {@Overridepublic boolean onSuccess(Bitmap bitmap) {return false;}@Overridepublic boolean onFailure() {return false;}}).into(imageView);

使用说明

  1. 其中url是你要请求的网络地址,loading是图片加载的占位图可以放一张动态图作为加载时显示的。listener是监听类。当加载成功的时候返回一个Bitmap,进行后续的逻辑设计。into是将加载的图片放到图片控件里面。

gilde控件高效性主要来源于线程的管理下面介绍一下生活中的例子来设计gilde。

顾客到联通营业厅的例子来设计glide控件。

联通营业厅管理着柜台和顾客,顾客相当于请求,柜台管理员相当于图片加载调度员。

顾客是一个队列,图片加载调度员是几个线程

先定义一个图片请求对象封装类如下

package com.tydfd.netgilde.netglide;/*** @Classname BitmapRequest* @Description 图片请求对象封装类* @Date 2019/7/16 8:42* @Created by liudo* @Author by liudo*/import android.content.Context;
import android.widget.ImageView;import com.tydfd.netgilde.MD5Utils;import java.lang.ref.SoftReference;
public class BitmapRequest {/*** 请求路径*/private String url;/*** 上下文*/private Context mContext;/*** 需要加载图片的控件*/private SoftReference<ImageView> mImageView;/*** 占位图片*/private int resID;/*** 回调对象*/private RequestListener mRequestListener;/*** 图片的标识*/private String urlMd5;public BitmapRequest(Context context){this.mContext = context;}public String getUrl() {return url;}public Context getContext() {return mContext;}public ImageView getImageView() {return mImageView.get();}public int getResID() {return resID;}public RequestListener getRequestListener() {return mRequestListener;}public String getUrlMd5() {return urlMd5;}/*** 链式调度* 加载url* @param url* @return*/public BitmapRequest load(String url){this.url = url;this.urlMd5 = MD5Utils.toMD5(url);return this;}/*** 设置占位图片* @param resID* @return*/public BitmapRequest loading(int resID){this.resID = resID;return this;}/*** 设置监听* @param listener* @return*/public BitmapRequest listener(RequestListener listener){this.mRequestListener = listener;return this;}public void into(ImageView imageView){imageView.setTag(this.urlMd5);this.mImageView = new SoftReference<>(imageView);RequestManager.getInstance().addBitmapRequest(this);}}
  1. SoftReference软引用的使用

    如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

    防止ImagView被内存回收导致程序崩溃

  2. MD5URL图片标识                                                                                                                                                                   图片的唯一性,用来防止图片混乱。
  3. 链式调度加载

通过链式加载让逻辑更加清晰,有助于管理参数。

package com.tydfd.netgilde.netglide;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Looper;
import android.widget.ImageView;import com.tydfd.netgilde.MyApplication;
import com.tydfd.netgilde.cache.DoubleLruCache;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.LinkedBlockingQueue;/*** @Classname BitmapDispatcher* @Description TODO* @Date 2019/7/16 9:29* @Created by liudo* @Author by liudo*/
public class BitmapDispatcher extends Thread {private Handler mHandler = new Handler(Looper.getMainLooper());/*** 创建一个堵塞队列*/private LinkedBlockingQueue<BitmapRequest> requestQueue;public BitmapDispatcher(LinkedBlockingQueue<BitmapRequest> requestQueue){this.requestQueue = requestQueue;}@Overridepublic void run() {super.run();/*** 当线程没有被打断的时候*/while (!isInterrupted()){try {BitmapRequest br = requestQueue.take();/*** 设置占位图片*/showLoadingImag(br);/*** 加载图片*/Bitmap bitmap = findBitMap(br);/*** 把图片显示到ImageView*/showImageView(br,bitmap);}catch (Exception e){e.printStackTrace();}}}private void showImageView(final BitmapRequest br, final Bitmap bitmap) {if(bitmap!=null&&br.getImageView() != null &&br.getUrlMd5().equals(br.getImageView().getTag())){final ImageView imageView = br.getImageView();mHandler.post(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(bitmap);if(br.getRequestListener() != null){RequestListener listener = br.getRequestListener();listener.onSuccess(bitmap);}}});}}private Bitmap findBitMap(BitmapRequest br) {Bitmap bitmap = downloadImage(br.getUrl()); return bitmap;}private Bitmap downloadImage(String uri) {FileOutputStream fos = null;InputStream is = null;Bitmap bitmap = null;try {/*** 创建一个URL对象*/URL url = new URL(uri);/*** 然后使用HttpURLConnection通过URL去开始读取数据*/HttpURLConnection conn = (HttpURLConnection) url.openConnection();is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);}catch (Exception e){e.printStackTrace();}finally {try{if (is != null){is.close();}} catch (IOException e){e.printStackTrace();}try{if (fos != null){fos.close();}} catch (IOException e){e.printStackTrace();}}return bitmap;}private void showLoadingImag(BitmapRequest br) {if(br.getResID() > 0&& br.getImageView() != null){final int resID = br.getResID();final ImageView imageView = br.getImageView();mHandler.post(new Runnable() {@Overridepublic void run() {imageView.setImageResource(resID);}});}}
}

如果当前线程没有被打断的时候继续相应请求的流程否则直接停止相应

银行管理类也即请求管理类

package com.tydfd.netgilde.netglide;import java.util.concurrent.LinkedBlockingQueue;/*** @Classname RequestManager* @Description TODO* @Date 2019/7/16 10:16* @Created by liudo* @Author by liudo*/
public class RequestManager {private static RequestManager sRequestManager = new RequestManager();/*** 创建阻塞队列*/private LinkedBlockingQueue<BitmapRequest> requestQueue = new LinkedBlockingQueue<>();private BitmapDispatcher[] mBitmapDispatchers;private RequestManager(){start();}/*** 开启所有线程的总开关*/private void start() {stop();startAllDispatcher();}/*** 将图片请求对象添加到队列中去* @param bitmapRequest*/public void addBitmapRequest(BitmapRequest bitmapRequest){if(bitmapRequest == null){return;}/*** 判断当前请求是否在队列中*/if(!requestQueue.contains(bitmapRequest)){requestQueue.add(bitmapRequest);}}/*** 停止所有的线程*/private void stop() {if(mBitmapDispatchers != null && mBitmapDispatchers.length > 0){for (BitmapDispatcher bitmapDispatcher : mBitmapDispatchers){if(!bitmapDispatcher.isInterrupted()){bitmapDispatcher.interrupt();}}}}/*** 创建并开始所有的线程*/private void startAllDispatcher() {/*** 获取手机支持的单个应用最大的线程数*/int threadCount = Runtime.getRuntime().availableProcessors();mBitmapDispatchers = new BitmapDispatcher[threadCount];for (int i = 0; i < threadCount; i++){BitmapDispatcher bitmapDispatcher = new BitmapDispatcher(requestQueue);bitmapDispatcher.start();/*** 要将每个dispatcher放到数组中,方便统一管理*/mBitmapDispatchers[i] = bitmapDispatcher;}}public static  RequestManager getInstance(){return sRequestManager;}
}

银行管理,管理顾客和图片加载调度员,也即请求管理管理请求类和请求响应类,为请求创建队列,管理请求相应执行顺序

整个思路很简单,首先请求类在队列排队,请求相应类在柜台等待执行请求,请求管理安排请求响应什么时候加载请求。通过队列的方式请求网络,使用 HttpURLConnection加载图片流。内容很简单。可以扩展三级缓存什么的。

Demo地址为https://download.csdn.net/download/qq_38366111/11376051

一键打造自己的Gilde图片加载控件相关推荐

  1. 9206晚自习点歌功能拆解 图片加载 控件显示与隐藏等等

    使用panel面版布局 控制面版的Dock属性 项目资源存放位置 bin/debug下 布局图片 工具栏的设置 设置工具项为图文模式 图在上,文在下 给菜单项添加图片,并且设置图片不压缩,不缩小 左右 ...

  2. Asp.net动态加载控件的一些问题

    ASP.net 动态加载控件时一些问题的总结 1 .在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件. 这个问题主要是由于将控件加载放在if (!Page.IsPostBack ...

  3. WinForm的延时加载控件概述

    这篇文章主要介绍了WinForm的延时加载控件,很实用的技巧,在C#程序设计中有着比较广泛的应用,需要的朋友可以参考下 本文主要针对WinForm的延迟加载在常用控件的实现做简单的描述.在进行C#项目 ...

  4. 2020.4.23工作记录————Regsvr32加载控件失败:“请确保该二进制存储在指定路径中。。。”

    工作记录----Regsvr32加载控件失败: 之前的OCX控件今天我因为工作需要又重新写了个新的,跟之前不同的是这次的控件链接了第三方的动态库,但是在OCX控件生成完成后我使用管理员身份运行cmd对 ...

  5. 64位 regsrv win10_Win10手动注册注册表提示regsvr32加载控件失败解决方案

    regsvr32加载控件失败怎么办?当我们在使用计算机时,有时候会发现有些注册表没有注册,需要手动进行注册,但是在cmd命令中,输入命令regsvr32 xx.dll,运行提示模块数据加载失败,这怎么 ...

  6. 省市县乡村 动态级联加载控件AreaRender(二)

    今天很激动啊,昨天下午赶时间写的省市县乡村 动态级联加载控件AreaRender(一)已经有博友评论了, 对于刚开始写博客的我是莫大的鼓励,我会继续写下去,逐步提高自己的文学素养,写出像 T2噬菌体博 ...

  7. Gilde图片加载框架的使用

    英文原文 Introduction to Glide, Image Loader Library for Android, recommended by Google 首发地址   http://jc ...

  8. 打造Android万能下拉刷新上拉加载控件

    转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/70159782 关于列表刷新加载的自定义控件,网上数不胜数,但别人的用起来始终不是那么 ...

  9. html 自动加载activex控件,管理加载项未显示加载控件

    已安装控件,但是在"管理加载项"中"所有加载项"中就是这个: 已安装的控件只有在网页调用此控件时才会在加载项里出现 IE加载项没有禁用Flash Player为 ...

最新文章

  1. 【AI实战】快速掌握TensorFlow(二):计算图、会话
  2. JSInfiniteScrollView
  3. xshell远程连接自动断开的问题解决
  4. Python3 Scrapy爬取猫眼TOP100代码示例
  5. HTML二刺螈网址导航模板
  6. Java web(2012/2/23)
  7. 国内语料库建设一览表
  8. ubuntu 12.04 源码安装 Xen 4.2
  9. 【图像隐写】基于matlab DWT数字水印嵌入+提取+攻击【含Matlab源码 622期】
  10. day21 re模块
  11. Unity3D游戏开发之Unity3D场景编辑器扩展开发
  12. MySQL经典50道练习题及全网最详细解析
  13. 《代码整洁之道》笔记整理
  14. 数据分析——KMeans聚类算法
  15. 你知道PDF拆分合并怎么弄吗?两个方法帮你轻松搞定!
  16. mysql计算同比和环比的区别_MySQL实践之同比环比
  17. 护士人文修养测试题答案
  18. python使用moviepy对视频提取音频和增加音频
  19. hdu 4379The More The Better
  20. c++冒泡排序如何计算迭代次数

热门文章

  1. Mother and child 妈妈与孩子
  2. 计算机excel操作实训报告,计算机基础实验报告电子表格处理.doc
  3. 基本k-mean聚类的文本聚类算法原理和例子
  4. 【advertisement(guanggao)】customize development(dingzhihuakaifa)
  5. Android图文列表实现(ListView)
  6. 百度索引量一直掉?3个变化追查投诉方法
  7. php邮件源代码,php 邮件类 使用教程源代码
  8. 【OpenCV学习笔记】图像平滑处理
  9. 第一个Docker应用栈 HelloWorld
  10. pyplot.scatter函数介绍