android替换Glide通讯组件为Okhttp并监控加载进度,安卓rxjava获取网络时间
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获取网络时间相关推荐
- Android学习笔记(Android Studio)3-3(ProgressBar ProgressDialog)(加载进度条、转圈圈)UI组件之弹出组件
Android学习笔记3-3 推荐新手向学习视频:B站https://www.bilibili.com/video/av38409964点我传送 3-3 ProgressBar & Progr ...
- android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView
图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...
- Android 11.0 Settings源码分析 - 主界面加载
Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...
- Android一键生成包含.dex的Jar及动态加载方案
Android一键生成包含.dex的Jar及动态加载方案 背景:谈到动态加载相信很多小伙伴都会想到 热更新 及 动态加载dex 的技术,最近也因为项目重构的需求,折腾了下这方面的技术点,以前研究过但时 ...
- android 加载进度,Android实现图片加载进度提示
本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...
- 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )
文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...
- android webview 加载进度和自定义404错误页面
原帖地址:http://www.cnblogs.com/winxiang/archive/2012/10/25/2738320.html 自定义404页面.android的webview 控件可以加载 ...
- Android 下载进度条, 自定义加载进度条,loading动画
1.自定义loadingline动画 /*** 作者:created by meixi* 邮箱:13164716840@163.com* 日期:2018/9/6 10*/public class Lo ...
- android webview设置加载进度条
1.自定义属性文件--attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources& ...
最新文章
- Python---图像读写操作(scipy)
- 《3D打印:正在到来的工业革命(第2版)》——1.6节先驱者们在做什么
- HTML(5)+CSS(3)--那些不知道但重要的知识!
- Linear Algebra lecture6 note
- oracle rac升级openssh,升级OpenSSH详细步骤
- BPF(BSD Packet Filter)
- LNMP搭建论坛(php)
- 天枰称重 (枚举法|进制转换逢十进一模版)
- Windows 8 Directx开发学习笔记(一)应用基本框架
- swagger测试上传图片报错
- 用Linux编写简单的atm取款机系统,详细解析C++编写的ATM自动取款机模拟程序
- 松下PLC 三个单位的延时定时器指令的使用
- 调用支付宝网页支付被浏览器拦截
- js过滤检测敏感词汇
- SQL Server 沿用上一日的数据
- C语言编程学习打造——做题游戏
- Linux--- vi文本编辑器
- DN2540的 spice 模型
- Linux【挂载新的硬盘挂载系统镜像】
- 2021年1月6日订阅朋友的问题与解决方案汇总