使用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); } });