开云官方app入口-TSM鏖战G2,Oner制霸全场

开云体育 2025-11-14 阅读:35 评论:0
  作者  本文由 焕然一璐投稿,博客地址:https://www.apkbus.com/myspaceblog-904275.html  前言  小巴士在文末Debug时间板块有问题哟,欢迎大家积极评论回复。Android开发中网络编程是...

  作者

  本文由 焕然一璐投稿,博客地址:https://www.apkbus.com/myspaceblog-904275.html

  前言

  小巴士在文末Debug时间板块有问题哟,欢迎大家积极评论回复。Android开发中网络编程是必不可少的,不接入互联网的APP就没有盈利可言。废话不多说了,下面请先看Android中网络请求的进化图:

  

  HttpURLConnection,Apache HTTP Client,Volley到现在的OKHttp,可谓天外有天,人外有人。为什么OKHttp会这么火呢,相信下面的介绍会告诉你答案。

  OKHttp的简介

TSM鏖战G2,Oner制霸全场

  首先,给出OKHttp的项目地址:https://github.com/square/okhttp

  Android为我们提供了两种HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP可以让您的应用运行更快、更节省流量。而OkHttp库就是为此而生。 OkHttp是一个高效的HTTP库:

  1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求

  2.如果SPDY不可用,则通过连接池来减少请求延时

  3.无缝的支持GZIP来减少数据流量

  1.缓存响应数据来减少重复的网络请求

  2.一般的get请求

  3.一般的post请求

  4.基于Http的文件上传

  5.文件下载

  6.加载图片

  7.支持请求回调,直接返回对象、对象集合

  8.支持session的保持

  OkHttp会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。(并发) 使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果您用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块。 从上面的简单介绍中可以知道,虽然在编程上面并不会简洁很多,但是OKHttp内部的一些功能能够帮助我们自动完成一些很复杂的操作,笔者个人认为最大的卖点就是大大节省用户的流量。

  OKHttp的基本使用

  1、在Gradle中引入CardView的依赖库。

  compile'com.squareup.okhttp:okhttp:3.8.0'

  2、OKHttp在使用之前,首先要了解下面几个比较核心的类以及它的功能。

OkHttpClient 客户端对象

Request是OkHttp中访问的请求,Post请求中需要包含RequestBody

Builder是辅助类,用于生产对象

Response即OkHttp中的响应,响应中可以得到返回是否成功,返回数据

MediaType 数据类型,用来表明是JSON等一系列格式

RequestBody 请求数据,在Post请求中用到

client.newCall(request).execute()是同步的请求方法

client.newCall(request).enqueue(Callback callBack)是异步的请求方法,但是Callback里面的代码是执行在子线程的,因此不能更新UI。

  3、OKHttp的基本使用步骤(以POST方式从服务器取JSON数据为例)

创建OkHttpClient对象,官方文档要求我们最好使用单例模式,在后文对OKHttp进行封装的时候会提到。

如果是post请求的话,需要通过FormEncodingBuilder创建RequestBody对象,指定需要post传进去的参数。get请求则不用。

创建Request对象,这个对象是请求对象,需要指定URL。post请求的时候需要指定RequestBody对象,get请求则不用。

调用OkHttpClient的newCall方法,把Request对象传进去,然后执行execute或者enqueue方法,两者的区别在上文已提到。在CallBack中的onResponse方法就可以做你需要做的事。onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等。

OkHttpClient client =

newOkHttpClient(); RequestBody body =

newFormEncodingBuilder() .add(

"type",

"1") .build();

Request

request=

new

Request.Builder() .url(Constants.URL_BANNER) .post(body) .build(); client.newCall(

request).enqueue(

newCallback() { @Override

  publicvoid onFailure( Requestrequest, IOException e) { } @Override

  publicvoid onResponse( Responseresponse) throws IOException {

  if( response.isSuccessful()) { android.os.Message msg = newMessage(); msg.what = 1; msg.obj = response.body(). string(); mHandler.sendMessage(msg); } } });

  这里只是一个简单post请求,从服务器获取数据的介绍,至于get请求只不过是去掉RequestBody对象而已。至于如何向服务器提交数据,可以在熟悉上面的基本用法之后查阅官方的WIKI(GitHub的介绍文档)。

  OKHttp的简单封装

  回顾上面的代码,试想一下如果每次请求都写这么多重复代码,这样会严重降低开发效率,因此需要对OKHttp进行封装。对代码进行封装是我们最为面向对象程序员的基本素养,减少重复代码,降低维护难度以及成本。

  GitHub上也有对OKHttp进行过封装,叫做OKHttpUtils。不过这里我们自己动手,一起来学习一下如何进行封装。具体的注意点有下面几点:

  1、首先,OKHttp官方要求我们最好用单例模式去使用OKHttpClient类的,因此我们自定义一个OKHttpHelper类,并且使用单例模式。

  2、对get以及post方法进行封装,主要的思想是把共同的代码抽取出来,例如代码中被抽取出来的request方法。

  3、对外公开一些静态方法,包括get和post方法等。

  4、Callback基类,对OKHttp的回调进行封装。这个类用里面有一个type,是方便回调中使用Gson对JSON进行解析的封装。使用Callback的时候只需要在泛型中传入类似Data 、List<Data>即可以方便地使用JSON。

  5、由于原来的回调不在主线程,因此我们需要使用Handler来将回调放入主线程。

  其余的可以参照代码,有详细注释。

  /** * 这个类用来辅助OKHttp */publicclassOkHttpHelper{ /** * 采用单例模式使用OkHttpClient */privatestaticOkHttpHelper mOkHttpHelperInstance;

  privatestaticOkHttpClient mClientInstance;

  privateHandler mHandler;

  privateGson mGson; /** * 单例模式,私有构造函数,构造函数里面进行一些初始化 */privateOkHttpHelper(){ mClientInstance = newOkHttpClient(); mClientInstance.setConnectTimeout( 10, TimeUnit.SECONDS); mClientInstance.setReadTimeout( 10, TimeUnit.SECONDS); mClientInstance.setWriteTimeout( 30, TimeUnit.SECONDS); mGson = newGson(); mHandler = newHandler(Looper.getMainLooper()); } /** * 获取实例 * * @return*/publicstaticOkHttpHelper getinstance(){

  if(mOkHttpHelperInstance == null) {

  synchronized(OkHttpHelper.class) {

  if(mOkHttpHelperInstance == null) { mOkHttpHelperInstance = newOkHttpHelper(); } } } returnmOkHttpHelperInstance; } /** * 封装一个request方法,不管post或者get方法中都会用到 */publicvoidrequest(finalRequest request, finalBaseCallback callback){ //在请求之前所做的事,比如弹出对话框等callback.onRequestBefore(); mClientInstance.newCall(request).enqueue( newCallback() {

  @OverridepublicvoidonFailure(Request request, IOException e){ //返回失败callbackFailure(request, callback, e); } @OverridepublicvoidonResponse(Response response)throwsIOException {

  if(response.isSuccessful()) { //返回成功回调String resString = response.body().string();

  if(callback.mType == String.class) { //如果我们需要返回String类型callbackSuccess(response, resString, callback); } else{ //如果返回的是其他类型,则利用Gson去解析try{ Object o = mGson.fromJson(resString, callback.mType); callbackSuccess(response, o, callback); } catch(JsonParseException e) { e.printStackTrace(); callbackError(response, callback, e); } } } else{ //返回错误callbackError(response, callback, null); } } }); } /** * 在主线程中执行的回调 * * @paramresponse * @paramresString * @paramcallback */privatevoidcallbackSuccess(finalResponse response, finalObject o, finalBaseCallback callback){ mHandler.post( newRunnable() {

  @Overridepublicvoidrun(){ callback.onSuccess(response, o); } }); } /** * 在主线程中执行的回调 * @paramresponse * @paramcallback * @parame */privatevoidcallbackError(finalResponse response, finalBaseCallback callback, finalException e){ mHandler.post( newRunnable() {

  @Overridepublicvoidrun(){ callback.(response, response.code(), e); } }); } /** * 在主线程中执行的回调 * @paramrequest * @paramcallback * @parame */privatevoidcallbackFailure(finalRequest request, finalBaseCallback callback, finalException e){ mHandler.post( newRunnable() {

  @Overridepublicvoidrun(){ callback.onFailure(request, e); } }); } /** * 对外公开的get方法 * * @paramurl * @paramcallback */publicvoidget(String url, BaseCallback callback){ Request request = buildRequest(url, null, HttpMethodType.GET); request(request, callback); } /** * 对外公开的post方法 * * @paramurl * @paramparams * @paramcallback */publicvoidpost(String url, Map<String, String> params, BaseCallback callback){ Request request = buildRequest(url, params, HttpMethodType.POST); request(request, callback); } /** * 构建请求对象 * * @paramurl * @paramparams * @paramtype * @return*/privateRequest buildRequest(String url, Map<String, String> params, HttpMethodType type){ Request.Builder builder = newRequest.Builder(); builder.url(url);

  if(type == HttpMethodType.GET) { builder.get(); } elseif(type == HttpMethodType.POST){ builder.post(buildRequestBody(params)); } returnbuilder.build(); } /** * 通过Map的键值对构建请求对象的body * * @paramparams * @return*/privateRequestBody buildRequestBody(Map<String, String> params){ FormEncodingBuilder builder = newFormEncodingBuilder();

  if(params != null) {

  for(Map.Entry<String, String> entity : params.entrySet()) { builder.add(entity.getKey(), entity.getValue()); } } returnbuilder.build(); } /** * 这个枚举用于指明是哪一种提交方式 */enumHttpMethodType { GET, POST }}

  回调的封装

TSM鏖战G2,Oner制霸全场

  package com.nan.cnshop.http;import com.google.gson.internal.$Gson$Types;import com.squareup.okhttp.Request;import com.squareup.okhttp.Response;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type; /** * 基本的回调 */publicabstractclassBaseCallback<T> { /** * type用于方便JSON的解析 */publicType mType; /** * 把type转换成对应的类,这里不用看明白也行。 * * @paramsubclass * @return*/staticType getSuperclassTypeParameter( Class<?> subclass) { Type superclass = subclass.getGenericSuperclass();

  if(superclass instanceofClass) {

  thrownewRuntimeException( "Missing type parameter."); } ParameterizedType parameterized = (ParameterizedType) superclass;

  return$Gson$Types.canonicalize(parameterized.getActualTypeArguments()[ 0]); } /** * 构造的时候获得type的class */publicBaseCallback() { mType = getSuperclassTypeParameter(getClass()); } /** * 请求之前调用 */publicabstractvoid onRequestBefore();

  /** * 请求失败调用(网络问题) * * @paramrequest * @parame */publicabstractvoid onFailure(Request request, Exceptione);

  /** * 请求成功而且没有错误的时候调用 * * @paramresponse * @paramt */publicabstractvoid onSuccess(Response response, T t);

  /** * 请求成功但是有错误的时候调用,例如Gson解析错误等 * * @paramresponse * @paramerrorCode * @parame */publicabstractvoid (Response response, int errorCode, Exceptione);} OKHttp封装之后的使用

  如下面的代码所示。首先得到OkHttpHelper的单例,然后调用get方法就可以了。由于继承了Gson,因此需要在BaseCallback的泛型中传入JSON对应的数据类型,笔者这里是List<Banner>。最后在onSuccess方法中做我们想要做的事情就可以了。

  mHttpHelper=OkHttpHelper.getinstance();mHttpHelper.get(Constants.URL_BANNER, newBaseCallback<List<Banner>>() {

  @OverridepublicvoidonRequestBefore(){ } @OverridepublicvoidonFailure(Request request, Exception e){ } @OverridepublicvoidonSuccess(Response response, List<Banner> banners){ initBanners(banners); } @Overridepublicvoid(Response response, interrorCode, Exception e){ }});

  是不是觉得封装之后OKHttp的使用变得很简单呢,这就是封装的强大之处,好了今天的笔记到此为止。

  PS:这里只介绍了OKHttp的get和post使用介绍,其余的使用例如文件下载上传以及对应的代码封装请自己去完成~(≧▽≦)/~啦啦啦。全文还有 BaseCallback 和 OkHttpHelper 的代码,欢迎阅读原文查看。

  Debug 时间

  

  如果完全没了优秀的第三方库简直令人抓狂,说说你对哪些优秀的第三方库相见恨晚呢?它们给你带来了哪些便利?

  回答认真的有趣的,小巴士会分享出来,开启无敌脑洞吧~另外,给安卓巴士公众号后台发送“报名交友”+你的联系方式(企鹅号/微信号),经过筛选就可以得到小巴士独家专访吸引更多妹子关注,帮你早日脱单,具体详情见此篇《这位程序员哥哥 其实我觊觎你很久了》。

版权声明

本文仅代表作者开云体育观立场。
本文系作者授权开云体育发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 开云体育app-包含独行侠轻取灰熊,萨博尼斯打破历史纪录的词条

    开云体育app-包含独行侠轻取灰熊,萨博尼斯打破历史纪录的词条
    1、上一场他们打西部鱼腩雷霆,萨博尼斯更是三节得到26+19+14的超大号三双带领球队57分狂胜对手创造 历史 ,现在步行者队的气势犹在另一边的奇才队,目前以29胜35负位列东部第10,虽然胜率还不足五成,不过奇才队可是从一度见不到季后赛曙光的情况下硬生生打进前十,首先是尽力争取到附加赛的机会,奇才在最近12场。...
  • 开云APP-泰国羽毛球队轻取印度羽毛球队,林丹高光表现的简单介绍

    开云APP-泰国羽毛球队轻取印度羽毛球队,林丹高光表现的简单介绍
      《神奇动物在哪里》最初是《哈利·波特》中霍格沃茨魔法学院“奇兽饲育学”课所使用的课本。    这本书收集了魔法世界里出现的上百种不同生物,是每位巫师家里必备的“工具书”。不知道你们是否还记得,哈利波特和他的同学们在霍格沃茨一年级的时候就使用过它。  电影《神奇动物在哪里》既不是《哈利波特》的续集也不是前传,但却不难发现J·K·罗琳早已在《哈利·波特》中埋下很深的伏笔,现在~我们就来看看《神奇动物在哪里》到底有多神奇~        这部电影是由大卫·叶茨执导,J·k·罗琳...
  • 开云体育官网-关于德国网球队爆冷法国网球队,费德勒统治全场的信息

    开云体育官网-关于德国网球队爆冷法国网球队,费德勒统治全场的信息
      如果你的朋友爱人最近都顶着一颗熊猫眼来见你,请对他们表示关爱,因为他们很有可能在熬夜看欧洲杯,而心爱的球队可能一下子爆冷踢了个一比二……当然不光我们,即使是足球明星也会时刻关注欧洲杯的杯赛,眼尖的小编发现来自马德里竞技足球俱乐部的足球明星安托瓦内·格里兹曼正和米格尔·安赫尔·莫亚几个好哥们儿围在一起,坐在由蓝色早晨独家代理的西班牙品牌FAMA的Arianne Love系列沙发上,专心致志地看着球赛。     画面里的足球明星们又帅又萌,妹子们是不是也和小编一样忍不住要胡思...
  • 开云体育-包含G2绝地反击RNG,Meiko2高光表现的词条

    开云体育-包含G2绝地反击RNG,Meiko2高光表现的词条
    2 职业态度Meiko自加入EDG以来,以其坚韧不拔的精神著称,七年间未曾缺席任何比赛,展现了他极高的职业素养和自律性在电竞界,这样的连续出勤纪录是非常罕见的,尤其是在高强度和伤病频发的竞技环境中,Meiko能保持如此稳定的出勤,充分体现了他的职业态度和对比赛的认真态度这种自律和投入是实力的重要组成部。 G2在四条线上都难以对RNG形成优势,因此他们在比赛中可能会处于被动地位赛程优势S赛的赛程足够长,能够给强队足够的发挥空间RNG作为强队之一,有足够的实力和耐心去应对G2的挑...
  • 开云体育官网-包含BLG绝杀MAD,Huni完成帽子戏法的词条

    开云体育官网-包含BLG绝杀MAD,Huni完成帽子戏法的词条
    比赛101分钟,帕尔默抽射变线绝杀,实现帽子戏法 #帕尔默绝杀##切尔西4比3曼联# 。 大电竞APP 国内首家专业电竞综合资讯手机APP,提供电竞新闻和赛事,观看文字直播和视频,用户可以相互交流 有惊无险BLG决胜局掏出绝活战胜PSG。 后者在禁区内冷静地晃过对方门将,轻松将球送入空门,再次为皇马添上了一分值得一提的是,本赛季他已经完成了两次帽子戏法,上一次是在10月22。 的角球中击败多赫蒂将球顶入球门,完成了他回到英超,后的第一个帽子戏法,并以一个绝杀帮助曼联锁定胜局...
标签列表