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的集合吧,不要再去相信静态的。你妹的。

0 0