Retrofit(二)

作者: 键盘上的麒麟臂 | 来源:发表于2017-09-07 14:52 被阅读84次

    我也不打算讲POST,GET这些表单提交啊的做法。这把讲几个比较重要的东西。

    一.Retrofit

    使用Retrofit第一个套路就是创建它的实例,不管用什么都要创建实例吧。

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://localhost:4567/")
            .build();
    

    从最简单的用法可以看出它用了build模式,可以说这设计非常的用心。我们来看看Builder这个内部类中的的方法(不知道build模式的最好先学一下,不难的)。这里教大家一个方法浏览这个类中有什么方法。只需要在AS的最左边点开Structure

    image.png

    就讲一些比较常用到的(不,是只讲我懂的,我不懂的也没法扯)。

    1.baseUrl

    这个就不用说了吧,两个baseUrl是内部相互调用的,源码单独抽出来不好讲,知道它的功能是设置基本的路径就行。

    2.addConverterFactory

    这是添加ConverterFactory,是用于转换响应体,过后会详细讲。

    3.addCallAdapterFactory

    这是添加CallAdapter,关于CallAdapter其实我也没去看,因为我用RxJava的,我觉得RxJava已经是很好用了,没必要再自己去定义CallAdapter(是我这种渣渣没必要,大神一般都喜欢用自己自定义的东西)

    4.callbackExecutor

    也是处理返回值,不过是用在同步的时候,我们平时一般都是用异步。

    5.client

    这是用于配置内部的OkHttp,平时也很常用到。

    最后常用配置后:
    Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient) //okHttpClient过后会说常用的创建
                    .addConverterFactory(FastJsonConvertFactory.create())// 可以用Gson
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
    

    二.两个Factory

    平时用到的addConverterFactory就是Gson,有时候可能需要用到xml,平时用到的addCallAdapterFactory就是Rxjava,或者可以不使用,我一直都是用RxJava,因为好用。
    addConverterFactory有时候需要自定义,所以我上一篇说了这个要学会怎么去自定义。

    三.RequestBody

    毫无疑问请求体是个很重要的东西, 我以前用过volley好像记得要自己弄请求体,而Retrofit在普通的post和get请求时并不需求拿到实例化的请求体对象,内部会帮你做好了,但是有时也需要对RequestBody进行一些操作。

    那么最常直接用到RequestBody的地方是哪里呢,就是文件的上传。
    文件上传的整个过程我肯定是到后面才会讲的,所以这个地方讲的时候可能会有些看不懂,没关系,大不了看完后面再看前面。

    先来一发RequestBody的结构

    image.png
    1.contentLength()

    这个是返回将要写入的字节数,默认是-1,表示不确定要写入多少,这个不常用到的,但是有些特殊需求可能会用到。

    2.contentType()

    返回Content-Type,就是

    image.png

    上传文件使用使用multipart是这样的一个格式,分割线里面的是一个文件,最好要把分割线内的格式背下,最好要把分割线内的格式背下,最好要把分割线内的格式背下,重要的事说三遍,这个格式是固定的,是相互约定形成的,你会看到里面有个Content-Type的字段。
    contentType()方法就是返回这个,如果是这里的请求,返回的就是image/jpeg。

    记住,这个方法返回的是MediaType类型,你只需要先知道MediaType这个类可以把它当成是描述Content-Type的字段。

    3.writeTo

    这个方法的注解是“将此请求的内容写入sink”,我也读不懂是什么意思。可以看看BufferedSink

    image.png

    说的大概就是一个缓冲区,也不是很了解,之后用到再具体学吧。

    4.create

    这个方法有重载,你会发现第一个参数是Content-Type的字段,第二个参数常用的一般用byte[]和File。

    实际使用

    你会发现,一般传图片时都会这样写,例如:

     RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/png"), file);
    

    这一个参数就是Content-Type,第二个参数他这里传file,当然传byte或者其它也行。

    四.ResponseBody

    image.png

    方法比RequestBody多,但是很多方法的作用都能从图中看懂,比如说byteStream就是获取InputStream。方法太多了也不好一个一个讲,之后将下载文件时会有个需求是监听下载进度,到时候再详细讲这个ResponseBody常用的方法。

    五.OkHttpClient

    在前面的创建Retrofit对象时,有一个client()方法,里面传的对象就是OkHttpClient类,也就是说如果我们需要配置一些请求时的配置(请求头、请求时间什么之类的),我们就需要在创建Retrofit时调用client()方法,所以我们就需要创建一个OkHttpClient对象。
    OkHttpClient类也是封装得很好,也是使用Builder模式,所以使用起来非常方便,我们来看看创建时可以调用哪些方法。

    image.png image.png
    1.connectTimeout、readTimeout、writeTimeout

    这很简单,设置连接时、写入时、读取时的超时时间。

    2.cookieJar

    这个是设置cookie

    3.setInternalCache、cache

    设置缓存,要自己创建InternalCache对象或者Cache对象,一般都是调用cache的吧。

    4.interceptors和networkInterceptors

    这个是返回一个拦截器数组,拦截器,什么是拦截器,我怎么感觉我好像要全部讲完OkHttp的过程,总之先了解这个是返回一个拦截器数组。

    5.addInterceptor和addNetworkInterceptor

    设置单个拦截器到拦截器数组中

    比如我们一般,不是一般,可以说是必须,设置日记拦截器,这样就能在Logcat中打印请求和响应的过程。

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    builder.addInterceptor(logging);
    

    这只是举个例子,还可以设置很多拦截器,包括自定义的拦截器。如果有时间会单独写一篇关于okhttp的,所以这里不多讲。

    5.proxy

    设置由该客户端创建的连接将使用的HTTP代理。

    6.sslSocketFactory

    设置用于保护HTTPS连接的套接字工厂和信任管理器。这个是和证书有关的,我http懂得也不是很多,不知道要怎么解释,反正就是如果是用Https的话要写这个方法,百度上也有教要怎么写。


    好了,这样就能创建传出一个Retrofit对象,并对一些常用到的对象和方法有了一定的了解,要想深入去使用,讲真还是要去看源码,源码这么多,我不是大神,我不可能全部讲完,而且也没那个时间,我只能随便东扯扯西扯扯,所以要弄懂一个东西,还是要靠自己

    相关文章

      网友评论

        本文标题:Retrofit(二)

        本文链接:https://www.haomeiwen.com/subject/iuzbjxtx.html