使用Retrofit这个网络框架而非直接使用OKhttp是因为Retrofit使用起来入手简单,配置灵活,而且其实质上也是对OKhttp的一个封装,并且支持同步异步和RXjava。

简单使用

1、创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com/") .build();

注:baseUrl必须以/结尾

2、创建Java服务接口

public interface MoviceService { @GET("users/{user}/movies") Call listMovies(@Path("user") String user);}

注:此接口为实现服务调用接口,通过Retofit可以创建该接口的代理实现,从而进行方法调用。

3、创建代理实现

MoviceService service = retrofit.create(MoviceService.class);

4、接口调用

Call repos = service.listMovies("jshare");

升级使用

在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,但一般情况下我们需要它返回我们自定义的实体;所以Retrofit提供了泛型支持响应转换。

1、添加转换Converter支持

api 'com.squareup.retrofit2:converter-gson:2.3.0'

2、创建Retrofit实例支持转换

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com") //url 自己写 .addConverterFactory(GsonConverterFactory.create()) .build();

3、自定义返回实体

public class HttpResult { /** * 编码 */ protected int code; /** * 信息 */ protected String message; /** * 返回的数据内容,类型不确定,使用泛型T表示 */ private T data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; }}

4、接口调用

@POST("api/movie")Observable> getCurrMovie(@Body MovieRequest request);

再升级使用结合RxJava

RxJava与CallAdapter

简介

RxJava 的本质可以压缩为异步这一个词。它就是一个实现异步操作的库。RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。

RxJava的四个基本概念

Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件.


Observable Observer 通过 subscribe() 方法实现订阅关系;从而 Observable 可以在需要的时候发出事件来通知 Observer。

RxJava的四个事件回调方法:

onSubscribe(@NonNull Disposable d): 提供给观察者当需要取消建立的连接时,进行取消操作;

public void onSubscribe(@NonNull Disposable d) { d.dispose();//实现断开Observer 与 Observable 的连接 }

onNext(): 被观察者可以多次调用此方法,返回给观察者不同的事件;

onCompleted(): 事件队列完结;

RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。

onError(): 事件队列异常;

在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。

注:在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

CallAdapter

Converter是对于Call中T的转换,而CallAdapter则可以对Call转换;这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter,这里以RxJava的为例,用Observable代替Call。

Retrofit&RxJava使用

1、引入RXJava支持

api 'com.squareup.retrofit2:converter-gson:2.3.0'api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

2、Retrofit添加RXjava支持

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.movie.com").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();

3、接口定义

@POST("api/movieTask")Observable> getCurrTask(@Body MovieRequest request);

4、接口调用

MoviceService service = retrofit.create(MoviceService.class);Observable observable = service.getmovieResult(request).subscribeOn(Schedulers.io()) .subscribe(new Subscriber>() { @Override public void onCompleted() { System.out.println("onCompleted"); } @Override public void onError(Throwable e) { System.err.println("onError"); } @Override public void onNext(Result> movieResult) { System.out.println(movieResult); } });