Retrofit+rxjava的缓存设置,以及glide的缓存设置
来源:互联网 发布:惠普游戏本 知乎 编辑:程序博客网 时间:2024/05/17 02:03
1现状: retrofit+rxjava加载网络数据,glide展示图片信息。
问题: retrofit的设置了一种拦截器,就是当没网的时候,走缓存,有网的时候,走网络,擦,因为我的疏忽,整了一下午的,我添加了两个拦截器,第二拦截器中也有对缓存的设置,替换掉了第一个,你妹的,一下午,全整这了,OK,那么没网走缓存,有网,走网络如何设置如下
import java.io.IOException;import okhttp3.CacheControl;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;/** * Created by Administrator on 2017/4/25. */public class RetrofitIntercept implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!NetUtils.isNetworkConnected(MyApplication.getContext())) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response originalResponse = chain.proceed(request); if (NetUtils.isNetworkConnected(MyApplication.getContext())) { //有网的时候也可以读接口上的@Headers里的配置,你可以在这里进行统一的设置 int maxAge = 0 * 60; // 有网络时 设置缓存超时时间0个小时 return originalResponse.newBuilder() .removeHeader("Cache-Control") .header("Cache-Control", "public, noCache,max-age=" + maxAge) .removeHeader("Pragma") .build(); } else { return originalResponse.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=2419200") .removeHeader("Pragma") .build(); } }}
使用如下,就是添加拦截器,就行,不用添加网络拦截器,。
2,就是glide的缓存的设置,如下,
import android.content.Context;import android.os.Environment;import com.bumptech.glide.Glide;import com.bumptech.glide.GlideBuilder;import com.bumptech.glide.load.engine.cache.DiskCache;import com.bumptech.glide.load.engine.cache.DiskLruCacheWrapper;import com.bumptech.glide.load.engine.cache.LruResourceCache;import com.bumptech.glide.module.GlideModule;import java.io.File;import huofeng.com.rlxw.MyApplication;/** * Created by Administrator on 2017/4/24. */public class SimpleGlideModule implements GlideModule { private static final int DISK_CACHE_SIZE = 100 * 1024 * 1024; public static final int MAX_MEMORY_CACHE_SIZE = 10 * 1024 * 1024; @Override public void applyOptions(Context context, GlideBuilder builder) { File cacheDir = null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { cacheDir = new File(MyApplication.getContext().getExternalCacheDir(), "/photos");//有sd卡,缓存在sd卡, } else { cacheDir = new File(MyApplication.getContext().getCacheDir(), "/photos"); } final File finalCacheDir = cacheDir; builder.setDiskCache(new DiskCache.Factory() { @Override public DiskCache build() { return DiskLruCacheWrapper.get(finalCacheDir, DISK_CACHE_SIZE); } }); builder.setMemoryCache(new LruResourceCache(MAX_MEMORY_CACHE_SIZE)); } @Override public void registerComponents(Context context, Glide glide) { }}//当然除此之外,需要在androidManifast.xml中配置,让其初始化,你的modle,并让glide自动使用//配置如下,在Application节点下 <meta-data android:name="文件的包名" android:value="GlideModule" />
现在为止,Retrofit跟glide全都设置好了,如果你代码没什么问题的话,就可以实现,有网加载网络,没网,加载缓存,并且glide也去缓存展示出来。但是我的并没有成功,怪我自作多情,考虑了viewpager+fragment的使用,就自己创建了一个fragment的工厂,每次adapter设置fragment,就根据位置,创建已经有的fragment,说的太麻烦,看代码,擦
/** * Created by Administrator on 2017/4/11. */public class FragmentFactory { SparseArray<BaseFragment> fragments; private static FragmentFactory mFragmensFc; private FragmentFactory() { fragments = new SparseArray<>(); } public static FragmentFactory getInstance() { if (mFragmensFc == null) { synchronized (FragmentFactory.class) { if (mFragmensFc == null) { mFragmensFc = new FragmentFactory(); } } } return mFragmensFc; } public Fragment createFragment(int postion) { BaseFragment fragment = fragments.get(postion); if (fragment == null) { switch (postion) { //TODO 目前只有一个分类,之后,再添加// case 0:// fragment = new FunPicsFragment();// break;// case 1:// fragment = new PpJoksFragment();// break;// case 2:// fragment = new BeaGirsFragment();// break;// case 3:// fragment = new VideosFragment();// break; case 0: Log.e("dddddd3", "ttttttttttttttt"); fragment = new BeaGirsFragment(); break; } fragments.append(postion, fragment); } Log.e("dddddd212", "ttttttttttttttt"); return fragment; }}
就这,整了一个管理fragment的工厂,以方便每次获取直接,取出来,哎,想法挺好的,但是错,就错在了,这是一个单例,静态的。当你Activity,finsh的时候,这个静态的并没有释放,擦,直接造成了,我再次打开app的时候,图片一直显示占位图,必须滑动一下,才能展示出来,真是醉了,
原因分析,就是当退出应用,finsh的是,再次打开,他沿用了你写那个静态中的fragment,直接拿来用的,静态中的fragment中布局,就是那几个占位图,究竟为什么,滑动一下,就可以了,应该fragment上的数据得到了更新,加载布局,显示。
解决方案:立刻去除自己的小聪明,还是老实的传递过去一个fragment的集合吧,不要再去相信静态的。你妹的。
- Retrofit+rxjava的缓存设置,以及glide的缓存设置
- 设置界面以及清理缓存的实现
- mybatis 缓存(三)缓存有关的设置以及属性
- 实现PHP服务器+Android客户端(Retrofit+RxJava)第三天Retrofit的配置以及缓存的实现
- 浅谈Glide缓存的大小以及清除缓存
- 泛型模式下的Retrofit + rxJava实现三级缓存
- tomcat 的缓存设置
- 页面缓存的设置
- nginx的缓存设置
- 设置缓存的大小
- WebView的缓存设置
- 设置缓存的大小
- glide的缓存策略
- Glide的缓存机制
- Glide的缓存机制
- Retrofit+okhttp 缓存的
- 页面的缓存与不缓存设置
- 页面的缓存与不缓存设置
- 53-套接字选项(SO_REUSEADDR)
- matlab安装后的启动以及权限问题
- 登录密码案例
- 在action中配置@Result(params={"root","{d,message}"})
- JavaSE 学习参考:反射机制(1)
- Retrofit+rxjava的缓存设置,以及glide的缓存设置
- 山东省第一届ACM省赛 Fairy tale(模拟)
- Linux学习<二> 四、五单元
- nyoj234 吃土豆 01背包
- NYOJ251 AMAZING AUCTION
- HBase在java代码中的使用
- 垃圾回收
- Lowest Common Ancestor of a Binary Search Tree
- Unity ShaderLab: 2D/3D Wave Flag Shader(飘动旗帜)的实现