微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 Retrofit、okhttp 和 picasso 缓存图像和字符串

我正在尝试优化此代码以用于缓存目的。此代码仅将缓存保留 1 天,然后再次重新连接到 Internet 以创建新缓存。我想在 60 天后再次访问 network make new cache 。使用 picasso 来自缓存的图像也会变慢 毕加索:2.5.2 改造2:改造:2.7.2 改造2:转换器-gson:2.7.2 okhttp3:okhttp:4.4.1 okhttp3: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,only-if-cached,max-stale=" + maxStale)
                         .removeHeader("Pragma")
                         .build();
             }
             return chain.proceed( request );
         }
     };
 }

} ```



 

解决方法

你可以像这个例子一样在拦截器中重写缓存头How to cache okHTTP response from Web server

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();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。