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