Retrofit+rxjava的缓存设置,以及glide的缓存设置

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值