首页 > 解决方案 > 下面源码中如何使用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();

标签: androidretrofit2

解决方案


对于某些云 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();  

我希望这有帮助。


推荐阅读