android - 下面源码中如何使用Retrofit Cache?
问题描述
我无法使用改造缓存。我已经在论坛上搜索了很多次,大部分结果都还可以,并且我能够找到它的概念,但是当我尝试在代码中实现时却无法做到。请帮助我,因为我也是改装新手。一周我尝试使用 volley 库,缓存一切正常,但是 volley 发送了两个请求,我的数据显示了两次,我尝试了所有可能的方法,但无法使用 volley 这样做,最后现在我转向改造,但又在这里我被困住了,因为我不是计算机科学背景。请帮助我,我会感谢大家。我只想对以下代码使用改造。这些示例代码取自https://github.com/prakashpun/RetrofitTutorial
RetrofitClientInstance.java
public class RetrofitClientInstance {
private static Retrofit retrofit;
private static final String BASE_URL = "https://jsonplaceholder.typicode.com";
public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
获取数据服务.java
public interface GetDataService {
@GET("/photos")
Call<List<RetroPhoto>> getAllPhotos();
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private CustomAdapter adapter;
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
Call<List<RetroPhoto>> call = service.getAllPhotos();
call.enqueue(new Callback<List<RetroPhoto>>() {
@Override
public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
generateDataList(response.body());
}
@Override
public void onFailure(Call<List<RetroPhoto>> call, Throwable t) {
progressDoalog.dismiss();
Toast.makeText(MainActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
}
});
}
private void generateDataList(List<RetroPhoto> photoList) {
recyclerView = findViewById(R.id.customRecyclerView);
adapter = new CustomAdapter(this,photoList);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
}
}
这些部分的示例,我将在上面的代码中实现以及如何实现。
Cache cache = new Cache(getCacheDir(), cacheSize);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain)
throws IOException {
Request request = chain.request();
if (!isNetworkAvailable()) {
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale \
request = request
.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
return chain.proceed(request);
}
})
.build();
解决方案
对于某些云 API 的缓存可能很有用,请参阅下面的链接以获取更多信息。
https://futurestud.io/tutorials/retrofit-2-activate-response-caching-etag-last-modified
总结如下步骤
1) 初始化缓存
int cacheSize = SIZE_MB * 1024 * 1024; // Size in mb
Cache cache = new Cache(getCacheDir(), cacheSize);
2) 使用 OkHttpClient 缓存功能
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.build();
3) 使用上面的http客户端构建Retrofit
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://www.your_api_base_url.in/")
.client(okHttpClient);
Retrofit retrofit = builder.build();
我希望这有帮助。
推荐阅读
- javascript - 删除多个用户脚本s 基于样式和/或 id - 如何创建它?
- python - 如何从行中减去数字以获得时差
- android - 片段在方向更改时创建两次
- android - 无法解析符号“BoundingBoxE6”
- javascript - 当事件来自 Django 服务器时,不调用 EventSource addEventListener 回调方法
- python - NumPy 用于设置行和列的索引
- html - 当项目占用不同宽度时,将弹性框中的最后一项移动到新行
- python - 使用 pycharm 运行 django models.py 时引发 AppRegistryNotReady 错误
- angular - 两个单独的 Angular 6 项目中的通用页眉和页脚?
- java - 向 Mockito.any() 提供类以使 verify() 调用明确的正确语法是什么?