Android 使用改装、okhttp、毕加索缓存图像和字符串

Android 使用改装、okhttp、毕加索缓存图像和字符串,android,caching,retrofit,picasso,okhttp,Android,Caching,Retrofit,Picasso,Okhttp,我正在开发一款包含大量动态和变化内容的应用程序。 加载应用程序时,我会从服务器中提取所有数据。 因此,几乎每个活动/片段都是单独加载的,这将导致用户等待很长时间才能单独加载每个“页面” 我的目标是在应用程序启动时创建一个加载页面,同时负责所有下载,并将磁盘缓存所有图像和信息(字符串),并在正确的时间提取它们。(或至少对大部分人而言) 我曾有机会将Reformation、okhttp和毕加索作为一个单独的附加库使用,但我知道它们可以一起工作并进行同步,并且至少可以通过其中两个库(毕加索和okhtt

我正在开发一款包含大量动态和变化内容的应用程序。 加载应用程序时,我会从服务器中提取所有数据。 因此,几乎每个活动/片段都是单独加载的,这将导致用户等待很长时间才能单独加载每个“页面”

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

我曾有机会将Reformation、okhttp和毕加索作为一个单独的附加库使用,但我知道它们可以一起工作并进行同步,并且至少可以通过其中两个库(毕加索和okhttp)进行磁盘缓存。我不确定哪一个库应该完成哪一部分,以及如何将它们同步在一起


我将非常感谢每一个提示/指导,谢谢。okhttp提供对缓存控制头的支持。我以前在一个应用程序中实现过它们,以便在网络不稳定时提供缓存,使用如下方式:

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

RestAdapter restAdapter = new RestAdapter.Builder()
        .setClient(new OkClient(client))
        .setServer("http://example.com")
        ...
        .build();
毕加索使用一些默认缓存大小限制自动缓存图像。你可以改变毕加索的默认设置,我找到了一些答案和答案。您可以在应用程序的
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);
如果你有时间开始(比如在加载屏幕上)并想让应用程序的后期加载更快,毕加索还允许你在应用程序生命周期的早期预取图像。为此,我将使用毕加索生成器中的
fetch
方法获取图像,但不将它们插入任何
imageview
。你也可以用谷歌搜索,但有一个快速的答案可以解释这背后的背景:

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

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

okhttp提供了对缓存控制头的支持。我以前在一个应用程序中实现过它们,以便在网络不稳定时提供缓存,使用如下方式:

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

RestAdapter restAdapter = new RestAdapter.Builder()
        .setClient(new OkClient(client))
        .setServer("http://example.com")
        ...
        .build();
毕加索使用一些默认缓存大小限制自动缓存图像。你可以改变毕加索的默认设置,我找到了一些答案和答案。您可以在应用程序的
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);
如果你有时间开始(比如在加载屏幕上)并想让应用程序的后期加载更快,毕加索还允许你在应用程序生命周期的早期预取图像。为此,我将使用毕加索生成器中的
fetch
方法获取图像,但不将它们插入任何
imageview
。你也可以用谷歌搜索,但有一个快速的答案可以解释这背后的背景:

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

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

请不要只是到处链接(尤其是外部网站上的文章)。把这些外部来源的相关部分作为引语放在你的答案中。这样,即使外部页面关闭,答案仍然有效。谢谢!看来这正是我需要的。我现在就开始读了。@LukasKnuth是的,当我写答案时,我就想到了这一点,所以我会更新它,但问题的所有部分都可以用不同的答案来回答。这不是一个重复的问题,因为没有其他问题会一起问相同的问题,所以用一堆so链接回答有什么害处?如果SO被关闭,链接被关闭,你甚至不能访问这个问题…@roarster问题可以被删除(即使用户删除了自己的帐户),就是这样。通常,如果答案很长,那么是的,链接很好。如果它归结为两句话或5行代码,引用它们并将链接作为源代码。请不要只是到处链接(特别是外部网站上的文章)。把这些外部来源的相关部分作为引语放在你的答案中。这样,即使外部页面关闭,答案仍然有效。谢谢!看来这正是我需要的。我现在就开始读了。@LukasKnuth是的,当我写答案时,我就想到了这一点,所以我会更新它,但问题的所有部分都可以用不同的答案来回答。这不是一个重复的问题,因为没有其他问题会一起问相同的问题,所以用一堆so链接回答有什么害处?如果SO被关闭,链接被关闭,你甚至不能访问这个问题…@roarster问题可以被删除(即使用户删除了自己的帐户),就是这样。通常,如果答案很长,那么是的,链接很好。如果它归结为两句话或5行代码,引用它们并将链接作为源代码。