当前位置: 首页 > 知识库问答 >
问题:

使用reverfit、okhttp和picasso缓存图像和字符串

景星华
2023-03-14

我正试图优化这段代码以实现缓存的目的。此代码使缓存仅为1天之前,它重新连接到internet再次建立新的缓存。我想让它60天前,它再次访问网络,使新的缓存。此外,使用picasso对来自缓存的映像也会减慢picasso:2.5.2reverfit2:reverfit:2.7.2reverfit2:Converter-GSON:2.7.2OKHTTP3:OKHTTP:4.4.1OKHTTP3:Logging-Interceptor:4.4.1

     if (retrofit==null) {
         OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                 .addInterceptor( provideHttpLoggingInterceptor() )
                 .addInterceptor( provideOfflineCacheInterceptor() )
                 .addNetworkInterceptor( provideCacheInterceptor() )
                 .cache( provideCache() )
                 .connectTimeout(60, TimeUnit.SECONDS)
                 .readTimeout(60, TimeUnit.SECONDS)
                 .writeTimeout(60, TimeUnit.SECONDS)
                 .build();

         OkHttp3Downloader okHttp3Downloader = new OkHttp3Downloader(okHttpClient);
         Picasso picasso = new Picasso.Builder(MyApplication.getInstance())
                 .downloader(okHttp3Downloader)
                 .build();


         Picasso.setSingletonInstance(picasso);

         retrofit = new Retrofit.Builder()
                 .baseUrl(Global.API_URL)
                 .client(okHttpClient)
                 .addConverterFactory(GsonConverterFactory.create())
                 .build();
     }
     return retrofit;
 }
 private static Cache provideCache ()
 {
     Cache cache = null;
     try
     {
         cache = new Cache( new File(MyApplication.getInstance().getCacheDir(), "wallpaper-cache" ),
                 100 * 1024 * 1024 ); // 100 MB
     }
     catch (Exception e)
     {
         Timber.e( e, "Could not create Cache!" );
     }
     return cache;
 }
 private static HttpLoggingInterceptor provideHttpLoggingInterceptor ()
 {
     HttpLoggingInterceptor httpLoggingInterceptor =
             new HttpLoggingInterceptor( new HttpLoggingInterceptor.Logger()
             {
                 @Override
                 public void log (String message)
                 {
                     Timber.d( message );
                     Log.v("MYAPI",message);

                 }
             } );
     httpLoggingInterceptor.setLevel( BuildConfig.DEBUG ? HEADERS : NONE );
     return httpLoggingInterceptor;
 }
 public static Interceptor provideCacheInterceptor ()
 {
     return new Interceptor()
     {
         @Override
         public Response intercept (Chain chain) throws IOException
         {
             Response response = chain.proceed( chain.request() );
             int maxAge = 60  * 60; // read from cache
             return response.newBuilder()
                     .header( CACHE_CONTROL, "public, max-age=" + maxAge)
                     .removeHeader("Pragma")
                     .build();
         }
     };
 }
 public static Interceptor provideOfflineCacheInterceptor ()
 {
     return new Interceptor()
     {

         @Override
         public Response intercept (Chain chain) throws IOException
         {
             Request request = chain.request();
             if ( !MyApplication.hasNetwork() )
             {
                 int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                 request = request.newBuilder()
                         .header( CACHE_CONTROL,  "public, only-if-cached, max-stale=" + maxStale)
                         .removeHeader("Pragma")
                         .build();
             }
             return chain.proceed( request );
         }
     };
 }

} ```



 

共有1个答案

柴星津
2023-03-14

您可以重写拦截器中的缓存头,比如这个示例如何缓存来自Web服务器的okHTTP响应

public class CacheInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Response response = chain.proceed(chain.request());

        CacheControl cacheControl = new CacheControl.Builder()
                .maxAge(15, TimeUnit.MINUTES) // 15 minutes cache
                .build();

        return response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                .header("Cache-Control", cacheControl.toString())
                .build();
    }
}
 类似资料:
  • 我有机会使用Registfit、okhttp和Picasso作为一个单独的附加库,虽然我知道它们可以一起工作并同步,磁盘缓存至少可以通过其中的两个库(Picasso和okhttp)使用,但我不确定哪个库应该做哪个部分,以及如何将它们同步在一起。 我将感谢每一个提示/指导,谢谢前面。

  • 问题内容: 注意:请没有库。 这对我来说很重要。另外,对此有各种各样的答案,但我发现没有一个能很好地解决该问题。请不要将其标记为重复项。提前致谢! 我的问题是,如果您在表中快速滚动,会看到旧图像并闪烁。 我所读问题的解决方案是取消 数据请求。但是我不知道如何在正确的时间和地点做到这一点。可能还有其他解决方案,但不确定。 这是我到目前为止的内容: 图像缓存类 用法 有什么想法吗? 问题答案: 几个问

  • 我尝试在图像视图中显示GIF图像作为加载占位符-使用Glide Library: 我试图显示此文件 加载2.gif 但是得到这个错误: 错误:(54,86)错误:找不到符号方法asGif() 如何在imageView中使用Glide显示GIF文件?

  • 我希望方法使用picasso从服务器加载图像,并且我希望显示一个进度条,直到照片完全下载完毕。下面是我的代码:

  • WordPress的示例短代码: 现在在上面的短代码中。代码中使用了一个图像。我想要获得图像,并在服务器中创建一个缓存,这样每个使用这个短代码的人都可以查看图像。目前,我正在使用base64编码的图像。