使用Retrofit,okhttp,picasso

时间:2016-05-08 10:54:56

标签: android caching retrofit picasso okhttp

我正在开发一款具有大量动态和不断变化的内容的应用。 当应用程序加载时,我从我的服务器中提取所有数据。 结果,几乎每个活动/片段都是单独加载的,这将导致用户为每个"页面等待很长时间。单独加载。

我的目标是在应用程序启动时创建一个加载页面,同时响应所有下载,并将磁盘缓存所有图像和信息(字符串)并在适当的时间拉取它们。 (或至少对大部分而言)

我有机会使用改造,okhttp和Picasso作为一个额外的库,我知道它们可以一起工作并同步,并且通过至少两个库(picasso和okhttp)可以获得磁盘缓存我不确定哪一个应该做哪个部分以及如何将它们同步到一起。

我将非常感谢每一个提示/指导,谢谢你。

1 个答案:

答案 0 :(得分:2)

okhttp提供对缓存控制标头的支持。我之前在应用程序中实现了它们,以便在使用this guide这样的网络不稳定时提供缓存:

int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(cacheDirectory, cacheSize);

client = new OkHttpClient.Builder()
    .cache(cache)
    .build();

由于Retrofit在内部使用okhttp(如果您至少使用了最新版本),则不要为其配置任何缓存。只需使用您刚刚配置的okhttp客户端:

RestAdapter restAdapter = new RestAdapter.Builder()
        .setClient(new OkClient(client))
        .setServer("http://example.com")
        ...
        .build();

Picasso使用某些默认缓存大小限制自动缓存图像。您可以更改Picasso的默认设置,我找到了一些答案herehere。您可以在应用程序的onCreate中设置缓存大小:

Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttpDownloader(this,Integer.MAX_VALUE));
        Picasso picasso = builder.build();
        picasso.setIndicatorsEnabled(true);
        picasso.setLoggingEnabled(true);
        Picasso.setSingletonInstance(picasso);

Picasso还允许您在应用程序的生命周期中预先获取图像,如果您有时间开始(例如,在加载屏幕上)并希望更快地加载应用程序的后续部分。为此,我将使用毕加索构建器中的fetch方法来获取图像,但不能将它们插入任何ImageViews。您也可以谷歌它,但有一个快速回答here,它解释了背后的背景:

Picasso.with(getApplicationContext())
                    .load(url)
                    .fetch();

IIRC您需要确保在尝试稍后检索时获取相同大小和转换后的图像,因为Picasso会缓存转换后的图像结果而不是原始下载图像。