import com.bumptech.glide.load.model.GlideUrl;

import com.bumptech.glide.load.model.ModelLoader;

import com.bumptech.glide.load.model.ModelLoaderFactory;

import java.io.InputStream;

import okhttp3.OkHttpClient;

/**

  • 仿照HttpUrlGlideUrlLoader

*/

public class OkHttpGlideUrlLoader implements ModelLoader<GlideUrl, InputStream> {

private OkHttpClient okHttpClient;

public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {

private OkHttpClient client;

public Factory() {

}

public Factory(OkHttpClient client) {

this.client = client;

}

private synchronized OkHttpClient getOkHttpClient() {

if (client == null) {

client = new OkHttpClient();

}

return client;

}

@Override

public ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {

return new OkHttpGlideUrlLoader(getOkHttpClient());

}

@Override

public void teardown() {

}

}

public OkHttpGlideUrlLoader(OkHttpClient client) {

this.okHttpClient = client;

}

@Override

public DataFetcher getResourceFetcher(GlideUrl model, int width, int height) {

return new OkHttpFetcher(okHttpClient, model);

}

}

自定义MyGlideModule注册OkHttpGlideUrlLoader


package tsou.cn.glidetest.Glide;

import android.content.Context;

import com.bumptech.glide.Glide;

import com.bumptech.glide.GlideBuilder;

import com.bumptech.glide.load.DecodeFormat;

import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;

import com.bumptech.glide.load.model.GlideUrl;

import com.bumptech.glide.module.GlideModule;

import java.io.InputStream;

import okhttp3.OkHttpClient;

import tsou.cn.glidetest.Glide.okhttp.OkHttpGlideUrlLoader;

import tsou.cn.glidetest.Glide.okhttp.ProgressInterceptor;

/**

  • 自定义模块

  • 目前Glide还无法识别我们自定义的MyGlideModule,

  • 如果想要让它生效,

  • 还得在AndroidManifest.xml文件当中加入如下配置才行

*/

public class MyGlideModule implements GlideModule {

/**

  • setMemoryCache()

  • 用于配置Glide的内存缓存策略,默认配置是LruResourceCache。

  • setBitmapPool()

  • 用于配置Glide的Bitmap缓存池,默认配置是LruBitmapPool。

  • setDiskCache()

  • 用于配置Glide的硬盘缓存策略,默认配置是InternalCacheDiskCacheFactory。

  • setDiskCacheService()

  • 用于配置Glide读取缓存中图片的异步执行器,默认配置是FifoPriorityThreadPoolExecutor,

  • 也就是先入先出原则。

  • setResizeService()

  • 用于配置Glide读取非缓存中图片的异步执行器,默认配置也是FifoPriorityThreadPoolExecutor。

  • setDecodeFormat()

  • 用于配置Glide加载图片的解码模式,默认配置是RGB_565。

*/

public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;

public static final String DISK_CACHE_NAME = “huangxiaoguo”;

@Override

public void applyOptions(Context context, GlideBuilder builder) {

/**

将所有Glide加载的图片缓存到SD卡上,

默认硬盘缓存大小都是250M,这里改为500

  • */

//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));

/**

ExternalCacheDiskCacheFactory的默认缓存路径

是在sdcard/Android/data/包名/cache/image_manager_disk_cache目录当中

*/

//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));

/**

  • 更改缓存最总文件夹名称

  • 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目录当中

*/

builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));

/**

  • Glide也能使用ARGB_8888的图片格式

  • 虽然图片质量变好了,但同时内存开销也会明显增大

*/

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

}

@Override

public void registerComponents(Context context, Glide glide) {

/**

  • 不带拦截功能,只是单纯替换通讯组件

*/

//glide.register(GlideUrl.class, InputStream.class, new OkHttpGlideUrlLoader.Factory());

OkHttpClient.Builder builder = new OkHttpClient.Builder();

builder.addInterceptor(new ProgressInterceptor());

OkHttpClient okHttpClient = builder.build();

glide.register(GlideUrl.class, InputStream.class, new OkHttpGlideUrlLoader.Factory(okHttpClient));

}

}

记得在androidManifest.xml中配置

<meta-data

android:name=“tsou.cn.glidetest.Glide.MyGlideModule”

android:value=“GlideModule” />

这里面我将Glide缓存路径更改为SD卡等配置

详细请看我的另一篇博客:http://blog.csdn.net/huangxiaoguo1/article/details/78583146

定义下载回调


package tsou.cn.glidetest.Glide.okhttp;

/**

  • 下载回调

*/

public interface ProgressListener {

void onProgress(int progress);

}

自定义拦截器:


package tsou.cn.glidetest.Glide.okhttp;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import okhttp3.Interceptor;

import okhttp3.Request;

import okhttp3.Response;

import okhttp3.ResponseBody;

/**

  • 拦截器

*/

public class ProgressInterceptor implements Interceptor {

static final Map<String, ProgressListener> LISTENER_MAP = new HashMap<>();

public static void addListener(String url, ProgressListener listener) {

LISTENER_MAP.put(url, listener);

}

public static void removeListener(String url) {

LISTENER_MAP.remove(url);

}

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

Response response = chain.proceed(request);

String url = request.url().toString();

ResponseBody body = response.body();

Response newResponse = response.newBuilder()

.body(new ProgressResponseBody(url, body)).build();

return newResponse;

}

}

监听下载进度的逻辑


package tsou.cn.glidetest.Glide.okhttp;

import android.util.Log;

import java.io.IOException;

import okhttp3.MediaType;

import okhttp3.ResponseBody;

import okio.Buffer;

import okio.BufferedSource;

import okio.ForwardingSource;

import okio.Okio;

import okio.Source;

/**

  • 监听下载进度的逻辑

*/

public class ProgressResponseBody extends ResponseBody {

private static final String TAG = “ProgressResponseBody”;

private BufferedSource bufferedSource;

private ResponseBody responseBody;

private ProgressListener listener;

public ProgressResponseBody(String url, ResponseBody responseBody) {

this.responseBody = responseBody;

listener = ProgressInterceptor.LISTENER_MAP.get(url);

}

@Override

public MediaType contentType() {

return responseBody.contentType();

}

@Override

public long contentLength() {

return responseBody.contentLength();

}

@Override

public BufferedSource source() {

if (bufferedSource == null) {

bufferedSource = Okio.buffer(new ProgressSource(responseBody.source()));

}

return bufferedSource;

}

private class ProgressSource extends ForwardingSource {

long totalBytesRead = 0;

int currentProgress;

ProgressSource(Source source) {

super(source);

}

@Override

public long read(Buffer sink, long byteCount) throws IOException {

long bytesRead = super.read(sink, byteCount);

long fullLength = responseBody.contentLength();

if (bytesRead == -1) {

totalBytesRead = fullLength;

} else {

totalBytesRead += bytesRead;

}

int progress = (int) (100f * totalBytesRead / fullLength);

Log.d(TAG, "download progress is " + progress);

if (listener != null && progress != currentProgress) {

listener.onProgress(progress);

}

if (listener != null && totalBytesRead == fullLength) {

listener = null;

}

currentProgress = progress;

return bytesRead;

}

}

}

布局

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout 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=“tsou.cn.glidetest.ListActivity”>

<android.support.v4.widget.SwipeRefreshLayout

android:id="@+id/swipe_refresh"

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<android.support.v7.widget.RecyclerView

android:id="@+id/recyclerview"

android:layout_width=“match_parent”

android:layout_height=“match_parent” />

</android.support.v4.widget.SwipeRefreshLayout>

使用的Adapter


package tsou.cn.glidetest.adapter;

import android.support.annotation.Nullable;

import android.widget.ImageView;

import android.widget.ProgressBar;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import java.util.List;

import java.util.Locale;

import tsou.cn.glidetest.R;

import tsou.cn.glidetest.Util.ImageLoadUtil;

import tsou.cn.glidetest.bean.ListBean;

import tsou.cn.glidetest.view.RoundProgressBar;

/**

  • Created by Administrator on 2017/11/13 0013.

*/

public class ListAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> {

public ListAdapter(@Nullable List data) {

super(R.layout.item_list, data);

}

@Override

protected void convert(BaseViewHolder helper, ListBean item) {

ImageLoadUtil.display((ImageView) helper.getView(R.id.iv_list_home_photo),

(RoundProgressBar) helper.getView(R.id.round_progressbar), item.getImage());

helper.setText(R.id.tv_list_home_title, item.getTitle());

helper.setText(R.id.tv_list_home_source,

String.format(Locale.getDefault(), mContext.getString(R.string.source), item.getSource()));

helper.setText(R.id.tv_list_home_focus,

String.format(Locale.getDefault(), “%d”, item.getStar()));

helper.setText(R.id.tv_list_home_comments,

String.format(Locale.getDefault(), “%d”, item.getEvn()));

}

}

adapter中的条目布局


<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:android_custom=“http://schemas.android.com/apk/res-auto”

xmlns:app=“http://schemas.android.com/apk/res-auto”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<android.support.v7.widget.CardView

android:id="@+id/cardview"

android:layout_width=“135dp”

android:layout_height=“90dp”

android:layout_marginLeft=“10px”

android:layout_marginRight=“40px”

android:layout_marginTop=“30px”

android:foreground="?attr/selectableItemBackground"

app:cardBackgroundColor="@android:color/white"

app:cardCornerRadius=“20px”

app:cardElevation=“10px”

app:cardPreventCornerOverlap=“false”

app:cardUseCompatPadding=“true”

app:contentPadding=“0px”>

<RelativeLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<ImageView

android:id="@+id/iv_list_home_photo"

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:scaleType=“fitXY” />

<tsou.cn.glidetest.view.RoundProgressBar

android:id="@+id/round_progressbar"

android:layout_width=“55dip”

android:layout_height=“55dip”

android:layout_centerInParent=“true”

android_custom:progress=“1”

android_custom:roundColor="#D1D1D1"

android_custom:roundProgressColor="#3F51B5"

android_custom:roundWidth=“5dip”

android_custom:textColor="#3F51B5"

android_custom:textSize=“12sp” />

</android.support.v7.widget.CardView>

<TextView

android:id="@+id/tv_list_home_title"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_alignTop="@id/cardview"

android:layout_marginRight=“20px”

android:layout_toRightOf="@id/cardview"

android:ellipsize=“end”

android:lineSpacingMultiplier=“1.2”

android:maxLines=“2”

android:paddingTop=“15px”

android:text="@string/app_name"

android:textColor="@android:color/black"

android:textSize=“14sp” />

<RelativeLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_alignBottom="@id/cardview"

android:layout_alignLeft="@id/tv_list_home_title"

android:layout_marginRight=“20px”>

<TextView

android:id="@+id/tv_list_home_comments"

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_alignParentRight=“true”

android:drawableLeft="@mipmap/icon_comments"

android:drawablePadding=“12px”

android:text="%d"

android:textColor="@android:color/darker_gray"

android:textSize=“12sp” />

<TextView

android:id="@+id/tv_list_home_focus"

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_marginRight=“25px”

android:layout_toLeftOf="@id/tv_list_home_comments"

android:drawableLeft="@mipmap/icon_star"

android:drawablePadding=“12px”

android:text="%d"

android:textColor="@android:color/darker_gray"

android:textSize=“12sp” />

<TextView

android:id="@+id/tv_list_home_source"

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginBottom=“25px”

android:layout_marginRight=“10px”

android:layout_toLeftOf="@id/tv_list_home_focus"

android:singleLine=“true”

android:text="@string/source"

android:textColor="@android:color/darker_gray"

android:textSize=“12sp” />

主页面代码逻辑


package tsou.cn.glidetest;

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

点击:Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

/tv_list_home_focus"

android:singleLine=“true”

android:text="@string/source"

android:textColor="@android:color/darker_gray"

android:textSize=“12sp” />

主页面代码逻辑


package tsou.cn.glidetest;

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

点击:Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

[外链图片转存中…(img-8HTri7YH-1646139637602)]

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

android替换Glide通讯组件为Okhttp并监控加载进度,安卓rxjava获取网络时间相关推荐

  1. Android学习笔记(Android Studio)3-3(ProgressBar ProgressDialog)(加载进度条、转圈圈)UI组件之弹出组件

    Android学习笔记3-3 推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送 3-3 ProgressBar & Progr ...

  2. android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView

    图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...

  3. Android 11.0 Settings源码分析 - 主界面加载

    Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...

  4. Android一键生成包含.dex的Jar及动态加载方案

    Android一键生成包含.dex的Jar及动态加载方案 背景:谈到动态加载相信很多小伙伴都会想到 热更新 及 动态加载dex 的技术,最近也因为项目重构的需求,折腾了下这方面的技术点,以前研究过但时 ...

  5. android 加载进度,Android实现图片加载进度提示

    本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...

  6. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  7. android webview 加载进度和自定义404错误页面

    原帖地址:http://www.cnblogs.com/winxiang/archive/2012/10/25/2738320.html 自定义404页面.android的webview 控件可以加载 ...

  8. Android 下载进度条, 自定义加载进度条,loading动画

    1.自定义loadingline动画 /*** 作者:created by meixi* 邮箱:13164716840@163.com* 日期:2018/9/6 10*/public class Lo ...

  9. android webview设置加载进度条

    1.自定义属性文件--attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources& ...

最新文章

  1. Python---图像读写操作(scipy)
  2. 《3D打印:正在到来的工业革命(第2版)》——1.6节先驱者们在做什么
  3. HTML(5)+CSS(3)--那些不知道但重要的知识!
  4. Linear Algebra lecture6 note
  5. oracle rac升级openssh,升级OpenSSH详细步骤
  6. BPF(BSD Packet Filter)
  7. LNMP搭建论坛(php)
  8. 天枰称重 (枚举法|进制转换逢十进一模版)
  9. Windows 8 Directx开发学习笔记(一)应用基本框架
  10. swagger测试上传图片报错
  11. 用Linux编写简单的atm取款机系统,详细解析C++编写的ATM自动取款机模拟程序
  12. 松下PLC 三个单位的延时定时器指令的使用
  13. 调用支付宝网页支付被浏览器拦截
  14. js过滤检测敏感词汇
  15. SQL Server 沿用上一日的数据
  16. C语言编程学习打造——做题游戏
  17. Linux--- vi文本编辑器
  18. DN2540的 spice 模型
  19. Linux【挂载新的硬盘挂载系统镜像】
  20. 2021年1月6日订阅朋友的问题与解决方案汇总

热门文章

  1. Chrome浏览器模拟手机
  2. GIF动图太大,无法添加?
  3. Flink RPC 详解
  4. Matlab中dec2bin函数使用
  5. Linux下的Makefile规则(隐式规则和模式规则)
  6. Win7设置AHCI模式启动
  7. [G星计划]--项目开发总结
  8. 详细介绍 LGPL 协议
  9. 开源授权协议GPL和LGPL的区别
  10. 安卓 自定义相机,身份证拍照