Android开发经验谈Android开发Android技术知识

Retrofit(二)

2017-09-07  本文已影响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对象,并对一些常用到的对象和方法有了一定的了解,要想深入去使用,讲真还是要去看源码,源码这么多,我不是大神,我不可能全部讲完,而且也没那个时间,我只能随便东扯扯西扯扯,所以要弄懂一个东西,还是要靠自己

上一篇下一篇

猜你喜欢

热点阅读