十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

拦截器在Android网络中的运用技巧

拦截器在Android网络中的运用技巧 当涉及到Android应用程序中的网络请求处理时OkHttp是一个非常强大和流行的工具。其中一个关键的功能是拦截器Interceptors它们允许您在请求和响应传输到服务器和应用程序之间执行各种操作。在本文中我们将深入研究OkHttp拦截器了解其工作原理以及如何使用它们来优化您的Android应用程序。什么是OkHttp拦截器OkHttp拦截器是一种机制允许您在网络请求和响应的传输过程中执行自定义操作。它们通常用于记录请求日志、修改请求头、缓存响应或进行身份验证等操作。拦截器可以按照添加它们的顺序依次执行从而形成一个拦截器链。拦截器链拦截器链是一个由多个拦截器组成的链条每个拦截器在请求和响应的传输过程中都有机会进行操作。这些拦截器按照它们添加的顺序执行因此顺序很重要。以下是一个拦截器链的示意图Request1-Interceptor1-Interceptor2-...-InterceptorN-Server--...--Response1-Interceptor1-Interceptor2-...-InterceptorN-ServerOkHttp中拦截器的工作原理OkHttp的核心组件是Interceptor接口和RealCall类。Interceptor接口定义了intercept()方法它接收一个Chain对象作为参数该对象用于执行拦截器链上的操作。RealCall类用于实际执行网络请求并管理拦截器链的执行。创建OkHttpClient首先您需要创建一个OkHttpClient实例该实例用于发起网络请求并配置拦截器链。OkHttpClient clientnewOkHttpClient.Builder().addInterceptor(newCustomInterceptor()).build();发起网络请求当您调用client.newCall(request)来创建一个新的网络请求时OkHttp会创建一个RealCall对象该对象代表了实际的网络请求。接下来RealCall会执行拦截器链上的操作。Request requestnewRequest.Builder().url(https://example.com/api).build();Call callclient.newCall(request);Response responsecall.execute();拦截器链执行拦截器链的执行是在RealCall类中完成的它遍历拦截器列表并按照添加顺序依次执行。以下是相关源码示例publicResponsegetResponseWithInterceptorChain()throws IOException{// 创建一个初始的Interceptor.ChainListInterceptorinterceptorsnewArrayList();interceptors.addAll(client.interceptors());interceptors.add(retryAndFollowUpInterceptor);interceptors.add(newBridgeInterceptor(client.cookieJar()));interceptors.add(newCacheInterceptor(client.internalCache()));interceptors.add(newConnectInterceptor(client));interceptors.add(newCallServerInterceptor(false));Interceptor.Chain chainnewRealInterceptorChain(interceptors,null,null,0,originalRequest,this,callStackTrace);// 依次执行拦截器returnchain.proceed(originalRequest);}Interceptor.Chain的实现RealInterceptorChain类实现了Interceptor.Chain接口它包含了当前请求的信息并负责执行拦截器链上的操作。在proceed()方法中它依次调用拦截器的intercept()方法将请求传递给下一个拦截器并最终返回响应。publicResponseproceed(Request request)throws IOException{// 执行下一个拦截器或者发起网络请求if(indexinterceptors.size())thrownewAssertionError();calls;if(chainnull)thrownewIllegalStateException(Check failed.);if(eventListener!null){eventListener.callStart(this);}// 获取当前拦截器Interceptor interceptorinterceptors.get(index);// 调用拦截器的intercept方法将请求传递给下一个拦截器或者执行网络请求Response responseinterceptor.intercept(this);if(eventListener!null){eventListener.callEnd(this);}returnresponse;}编写自定义拦截器要编写自定义拦截器首先需要实现Interceptor接口并实现intercept()方法。这个方法接收一个Chain对象作为参数允许您访问和操作请求和响应。publicclassCustomInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{// 在请求前执行的代码Request originalRequestchain.request();// 可以修改请求Request modifiedRequestoriginalRequest.newBuilder().addHeader(Authorization,Bearer YourAccessToken).build();// 执行请求Response responsechain.proceed(modifiedRequest);// 在响应后执行的代码// 可以修改响应returnresponse;}}实际应用示例以下是一些实际运用示例展示了如何使用OkHttp拦截器来实现不同的功能日志记录这个拦截器用于记录请求和响应的详细信息有助于调试和排查问题。publicclassLoggingInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();long startTimeSystem.nanoTime();Log.d(OkHttp,String.format(Sending request %s on %s%n%s,request.url(),chain.connection(),request.headers()));Response responsechain.proceed(request);long endTimeSystem.nanoTime();Log.d(OkHttp,String.format(Received response for %s in %.1fms%n%s,response.request().url(),(endTime-startTime)/1e6d,response.headers()));returnresponse;}}身份验证这个拦截器用于在每个请求中添加身份验证标头以确保请求是经过身份验证的。publicclassAuthInterceptorimplementsInterceptor{privatefinal String authToken;publicAuthInterceptor(String authToken){this.authTokenauthToken;}OverridepublicResponseintercept(Chain chain)throws IOException{Request originalRequestchain.request();// 添加身份验证标头Request authenticatedRequestoriginalRequest.newBuilder().header(Authorization,Bearer authToken).build();returnchain.proceed(authenticatedRequest);}}缓存这个拦截器用于实现响应缓存以减少对服务器的请求。publicclassCacheInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();// 在这里检查是否有缓存可用如果有返回缓存的响应Response responsechain.proceed(request);// 在这里将响应缓存起来returnresponse;}}请求重试这个拦截器用于处理请求失败时的重试逻辑。publicclassRetryInterceptorimplementsInterceptor{privatefinal int maxRetryCount;publicRetryInterceptor(int maxRetryCount){this.maxRetryCountmaxRetryCount;}OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();Response responsenull;IOException lastExceptionnull;for(int retryCount0;retryCountmaxRetryCount;retryCount){try{responsechain.proceed(request);if(response.isSuccessful()){returnresponse;}}catch(IOException e){lastExceptione;}}// 如果达到最大重试次数仍然失败抛出异常throwlastException;}}自定义响应处理这个拦截器用于在接收到响应后执行自定义的响应处理逻辑。publicclassResponseProcessingInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();Response responsechain.proceed(request);// 在这里对响应进行自定义处理returnresponse;}}错误处理这个拦截器用于处理一些常见的错误情况publicclassErrorHandlingInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();try{Response responsechain.proceed(request);// 检查响应是否成功if(!response.isSuccessful()){// 在这里处理错误可以抛出自定义异常thrownewMyHttpException(response.code(),response.message());}returnresponse;}catch(IOException e){// 在这里处理网络连接错误thrownewMyNetworkException(e.getMessage(),e);}}}重定向请求这个拦截器用于自定义重定向行为publicclassRedirectInterceptorimplementsInterceptor{OverridepublicResponseintercept(Chain chain)throws IOException{Request requestchain.request();Response responsechain.proceed(request);// 检查是否是重定向响应if(response.isRedirect()){String newUrlresponse.header(Location);if(newUrl!null){// 构建新的请求并继续Request newRequestrequest.newBuilder().url(newUrl).build();responsechain.proceed(newRequest);}}returnresponse;}}结论OkHttp拦截器是Android应用程序中处理网络请求的有力工具。通过创建自定义拦截器您可以在请求和响应的传输过程中执行各种操作以优化您的应用程序。无论是日志记录、身份验证、缓存还是其他操作拦截器都可以帮助您更好地控制和定制网络请求流程。最后大家分享一份全套的Android学习资料给那些想学习 Android 的小伙伴们一点帮助适用于任何想学习Android开发但不知道从哪里开始的人也适用于已经开始进行Android开发但想要变得更好的任何人一、Android所有方向的学习路线为了成为更好的 Android 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。如果下面这个学习路线能帮助大家成为一个更好的 Android 开发者那么我的使命也就完成了包括Android应用开发、系统开发、音视频开发、Flutter开发、小程序开发、UI界面、车载系统开发等等二、学习软件工欲善其事必先利其器。学习Android常用的Android Studio视频教程和Android Studio最新的安装包都在这里了给大家节省了很多时间。三、进阶学习视频我们在学习的时候往往书籍源码难以理解阅读困难这时候视频教程教程是就很适合了生动形象加上案例实战科学有趣才能更方便的学习下去。四、实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。五、经典书籍阅读阅读Android经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习Android开发的读者来说阅读Android经典书籍是非常有必要的。六、面试资料我们学习Android必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有阿里大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。这份完整版的Android全套学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表