【发布时间】:2017-12-29 22:22:35
【问题描述】:
这是我的代码,我在其中调用 api 并通过改造为 okhttp 定义缓存:
public class DemoPresenter {
DemoView vDemoView;
private Context mContext;
public DemoPresenter(Context mcontext, DemoView vDemoView) {
this.vDemoView = vDemoView;
this.mContext = mcontext;
}
public void callAllProduct() {
if (vDemoView != null) {
vDemoView.showProductProgressBar();
}
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(mContext.getCacheDir(), 10 * 1024 * 1024)) // 10 MB
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (BasicUtility.isInternet(mContext)) {
request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
} else {
request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build();
}
return chain.proceed(request);
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("www.xyz.com/data/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
AllApi productApiService = retrofit.create(AllApi.class);
Call<ProductData> call = productApiService.getProduct();
try {
call.enqueue(new Callback<ProductData>() {
@Override
public void onResponse(Call<ProductData> call, Response<ProductData> response) {
ArrayList<Product> alproducts = new ArrayList<>();
try {
alproducts = response.body().getProductData();
onSuccess(alproducts);
} catch (Exception e) {
}
}
@Override
public void onFailure(Call<ProductData> call, Throwable t) {
}
});
} catch (Exception e) {
}
}
private void onSuccess(ArrayList<Product> alproducts) {
if (vDemoView != null) {
vDemoView.hideProductProgressBar();
vDemoView.onProductSuccess(alproducts);
}
}
}
现在从我的主要活动中,我正在调用这个演示者类:
DemoPresenter mDemoPresenter = new DemoPresenter(getApplicationContext(),this);
mDemoPresenter.callAllProduct();
现在,当我通过 Internet 连接运行此活动时,它可以正常工作,但是当我断开 Internet 并再次运行此活动时,它不会从缓存中加载数据。
如果没有互联网,我如何从缓存中加载这些数据?
【问题讨论】:
-
已经试过了,离线模式下不行!
-
服务器是否真的回复了允许/支持缓存的内容?除非设置了正确的标头,否则 Afaik OkHttp 不会缓存内容。
-
没有。服务器没有存储缓存数据!!!
标签: android caching retrofit retrofit2 okhttp3