改造2 OkHttpClient缓存不起作用

编程入门 行业动态 更新时间:2024-10-12 22:32:24
本文介绍了改造2 OkHttpClient缓存不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

所以这是问题所在,我正在尝试为我的应用程序实现缓存,我遵循了本教程 Android:使用Retrofit2和OkHTTP3 缓存网络请求以进行脱机访问.遗憾的是,没有互联网连接时,不会显示缓存的响应,而是

So here's the problem, I'm trying to implement caching for my app and I followed this tutorial Android: Cache network requests for offline access with Retrofit2 and OkHTTP3 to do it. Sadly, cached responses are not showing up when there is no internet connection, instead the

Toast.makeText(getContext(),getContext().getResources().getString(R.string.error_failed_to_load_posts),Toast.LENGTH_SHORT).show();

Toast.makeText(getContext(), getContext().getResources().getString(R.string.error_failed_to_load_posts), Toast.LENGTH_SHORT).show();

被执行.那么谁能告诉我我做错了吗?还是指导我获得这个问题的答案?如果您有问题,我会在需要时发布其他信息.下面是特定功能的完整代码.

gets executed. So can anyone tell me what I am doing wrong? Or guide me to get an answer to this problem? I'll post additional info if needed if you ask me. Below is the entire code of the specific function.

private void loadHomeLoggedPosts(String uid) { progressBar.setVisibility(View.VISIBLE); OkHttpClient client = new OkHttpClient .Builder() .cache(new Cache(getContext().getCacheDir(), 10 * 1024 * 1024)) // 10 MB .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (Utils.isNetworkAvailable(getContext())) { request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build(); } else { request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build(); } return chain.proceed(request); } }) .build(); Gson gson = new GsonBuilder() .setLenient() .create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(getResources().getString(R.string.app_base_url)) .client(client) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); RequestInterface request = retrofit.create(RequestInterface.class); Call<Classes> call = request.homeLoggedPosts(uid); call.enqueue(new Callback<Classes>() { @Override public void onResponse(Call<Classes> call, Response<Classes> response) { Classes jsonResponse = response.body(); if (jsonResponse!=null) { homePosts = jsonResponse.getHomePosts(); homeLoggedInAdapter = new HomeLoggedInAdapter(homePosts); recyclerView.setAdapter(homeLoggedInAdapter); homeLoggedInAdapter.notifyDataSetChanged(); } else { Toast.makeText(getContext(), getContext().getResources().getString(R.string.error_failed_to_load_posts), Toast.LENGTH_SHORT).show(); } progressBar.setVisibility(View.INVISIBLE); } @Override public void onFailure(Call<Classes> call, Throwable t) { progressBar.setVisibility(View.INVISIBLE); Toast.makeText(getContext(), getContext().getResources().getString(R.string.error_failed_to_load_posts), Toast.LENGTH_SHORT).show(); Log.d("ERROR", t.getMessage()); } }); }

编辑:我在同一片段中有两个函数,调用方式如下:

I've two functions in the same fragment calling as follows:

if (FirebaseAuth.getInstance().getCurrentUser()!=null) { loadHomeLoggedPosts(FirebaseAuth.getInstance().getCurrentUser().getUid()); } else { loadHomeNotLoggedPosts(); }

我已经在上面发布了loadHomeLoggedPosts的代码. loadHomeNotLoggedPosts相同,不同之处仅在于此部分:

I've posted the code for loadHomeLoggedPosts above. loadHomeNotLoggedPosts is the same with he difference being this section only:

RequestInterface request = retrofit.create(RequestInterface.class); Call<Classes> call = request.homeNotLoggedPosts();

Farmaan Elahis的答案适用于loadHomeNotLoggedPosts,但不适用于loadHomeLoggedPosts.任何帮助都将受到高度赞赏.谢谢!

Farmaan Elahis' answer works for loadHomeNotLoggedPosts , but not for loadHomeLoggedPosts. Any help is highly appreciated. Thanks!

Okhttp日志:我已经编辑了一些部分,因为日志太大而无法在此处完整发布.

Okhttp log: I've edited out some portions as the log was too big to post here fully.

拳头启动:

08-27 18:35:29.426 32673-32673/com.appsoflife.microstories I/System.out: Cache CREATED! 08-27 18:35:29.452 32673-2498/com.appsoflife.microstories D/OkHttp: --> POST my_web_site/jacob/micro_stories/queries/home_logged.php http/1.1 08-27 18:35:29.452 32673-2498/com.appsoflife.microstories D/OkHttp: Content-Type: application/x-www-form-urlencoded 08-27 18:35:29.452 32673-2498/com.appsoflife.microstories D/OkHttp: Content-Length: 32 08-27 18:35:29.452 32673-2498/com.appsoflife.microstories D/OkHttp: uid=MY_USER_ID 08-27 18:35:29.452 32673-2498/com.appsoflife.microstories D/OkHttp: --> END POST (32-byte body) 08-27 18:35:29.460 32673-2363/com.appsoflife.microstories D/AppTracker: App Event: start 08-27 18:35:29.502 32673-32673/com.appsoflife.microstories E/RecyclerView: No adapter attached; skipping layout 08-27 18:35:29.592 32673-32679/com.appsoflife.microstories I/art: Do partial code cache collection, code=27KB, data=30KB 08-27 18:35:29.593 32673-32679/com.appsoflife.microstories I/art: After code cache collection, code=26KB, data=29KB 08-27 18:35:29.593 32673-32679/com.appsoflife.microstories I/art: Increasing code cache capacity to 128KB 08-27 18:35:29.614 32673-32673/com.appsoflife.microstories W/PropertyValuesHolder: Method set() with type float not found on target class class me.zhanghai.android.materialprogressbar.IndeterminateHorizontalProgressDrawable$RectTransformX 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: <-- 200 OK my_web_site/jacob/micro_stories/queries/home_logged.php (3634ms) 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Date: Sun, 27 Aug 2017 13:05:29 GMT 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Server: Apache/2.4.25 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: X-Powered-By: PHP/5.6.30 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Vary: Accept-Encoding,User-Agent 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Keep-Alive: timeout=5 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Connection: Keep-Alive 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Transfer-Encoding: chunked 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Content-Type: text/html; charset=UTF-8 08-27 18:35:33.088 32673-2498/com.appsoflife.microstories D/OkHttp: Cache-Control: max-age=120 08-27 18:35:37.890 32673-2653/com.appsoflife.microstories I/FirebaseCrash: Sending crashes 08-27 18:35:41.664 32673-32695/com.appsoflife.microstories W/art: Suspending all threads took: 9.530ms 08-27 18:35:41.681 32673-2498/com.appsoflife.microstories D/OkHttp: MY_JSON_OUTPUT_TOO_LONG_TO_POST 08-27 18:35:41.721 32673-2498/com.appsoflife.microstories D/OkHttp: <-- END HTTP (3297402-byte body)

第二时间:

08-27 18:37:35.904 5089-5089/com.appsoflife.microstories I/System.out: Cache CREATED! 08-27 18:37:35.922 5089-5190/com.appsoflife.microstories D/OkHttp: --> POST my_web_site/jacob/micro_stories/queries/home_logged.php http/1.1 08-27 18:37:35.922 5089-5190/com.appsoflife.microstories D/OkHttp: Content-Type: application/x-www-form-urlencoded 08-27 18:37:35.922 5089-5190/com.appsoflife.microstories D/OkHttp: Content-Length: 32 08-27 18:37:35.922 5089-5190/com.appsoflife.microstories D/OkHttp: uid=MY_USER_ID 08-27 18:37:35.922 5089-5190/com.appsoflife.microstories D/OkHttp: --> END POST (32-byte body) 08-27 18:37:35.934 5089-5135/com.appsoflife.microstories D/AppTracker: App Event: start 08-27 18:37:35.979 5089-5089/com.appsoflife.microstories E/RecyclerView: No adapter attached; skipping layout 08-27 18:37:36.058 5089-5094/com.appsoflife.microstories I/art: Do partial code cache collection, code=26KB, data=30KB 08-27 18:37:36.058 5089-5094/com.appsoflife.microstories I/art: After code cache collection, code=25KB, data=29KB 08-27 18:37:36.058 5089-5094/com.appsoflife.microstories I/art: Increasing code cache capacity to 128KB 08-27 18:37:36.083 5089-5089/com.appsoflife.microstories W/PropertyValuesHolder: Method set() with type float not found on target class class me.zhanghai.android.materialprogressbar.IndeterminateHorizontalProgressDrawable$RectTransformX 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: <-- 200 OK my_web_site/jacob/micro_stories/queries/home_logged.php (3937ms) 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Date: Sun, 27 Aug 2017 13:07:36 GMT 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Server: Apache/2.4.25 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: X-Powered-By: PHP/5.6.30 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Vary: Accept-Encoding,User-Agent 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Keep-Alive: timeout=5 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Connection: Keep-Alive 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Transfer-Encoding: chunked 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Content-Type: text/html; charset=UTF-8 08-27 18:37:39.860 5089-5190/com.appsoflife.microstories D/OkHttp: Cache-Control: max-age=120 08-27 18:37:49.883 5089-5426/com.appsoflife.microstories I/FirebaseCrash: Sending crashes 08-27 18:37:51.044 5089-5190/com.appsoflife.microstories D/OkHttp: JSON_OUTPUT_TOO_LONG_TO_POST read: unexpected EOF!

推荐答案

您可以使用以下代码构建okhttp客户端,该客户端既可以具有有效期为2分钟的在线缓存,也可以具有可以有效期为7的离线缓存天.

You can use the below code to build you okhttp client which can have both online cache which is valid for 2 minutes as well as offline cache whcih is valid for 7 days.

PS:您需要考虑在未显示互联网异常的情况下首次打开该应用程序

PS: You need to consider opening the app for the first time with internet connected show that it doesn't throw exception

private static OkHttpClient provideOkHttpClient () { return new OkHttpClient.Builder() .addInterceptor( provideOfflineCacheInterceptor() ) .addNetworkInterceptor( provideCacheInterceptor() ) .cache( provideCache() ) .build(); } private static Cache provideCache () { Cache cache = null; try { cache = new Cache( new File( getApplicationContext().getInstance().getCacheDir(), "http-cache" ), 10 * 1024 * 1024 ); // 10 MB } catch (Exception e) { Timber.e( e, "Could not create Cache!" ); } return cache; } public static Interceptor provideCacheInterceptor () { return new Interceptor() { @Override public Response intercept (Chain chain) throws IOException { Response response = chain.proceed( chain.request() ); // re-write response header to force use of cache CacheControl cacheControl = new CacheControl.Builder() .maxAge( 2, TimeUnit.MINUTES ) .build(); return response.newBuilder() .header( CACHE_CONTROL, cacheControl.toString() ) .build(); } }; } public static Interceptor provideOfflineCacheInterceptor () { return new Interceptor() { @Override public Response intercept (Chain chain) throws IOException { Request request = chain.request(); if ( !AndroidUtils.isNetworkAvailable() ) { CacheControl cacheControl = new CacheControl.Builder() .maxStale( 7, TimeUnit.DAYS ) .build(); request = request.newBuilder() .cacheControl( cacheControl ) .build(); } return chain.proceed( request ); } }; }

更多推荐

改造2 OkHttpClient缓存不起作用

本文发布于:2023-11-26 08:38:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1633402.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:缓存   不起作用   OkHttpClient

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!