总结一下几种目前接触到的Retrofit使用方法
一、最最最最最最基本的用法
一股脑的写法,缺点很明显,会造成代码很长而且不够简洁,不方便后来的阅读和维护。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("(这里填写的是url)")
.addConverterFactory(GsonConverterFactory.create()) //这里是为了直接用Gson解析数据,也可以不写,之后用ResponseBody
.build;
HotService service = retrofit.create(HotWebServce.class);
call call = getMovieService.getHotList("武汉");//传入请求参数
call.enqueue(new MoiveCallback() {
@Override
public void onResponse(Call call, Response response) {
super.onResponse(call, response);
//这里做请求成功的逻辑
}
@Override
public void onFailure(Call call, Throwable t) {
super.onFailure(call, t);
//这里做请求失败的逻辑
}
});
二、之前一直在用的方法
将前半部分封装起来,直接调用,比第一种方法稍微简洁一些。缺点:会产生很多的文件,对于少量数据接口请求可以使用。
1、创建BaseWebApi:
public abstract class BaseWebApi {
public String baseUrl = "http://api.douban.com/v2/movie/";
Retrofit getApi(String url){
return new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public abstract T getServce();
}
2、每一个WebApi都继承自BaseWebApi:
public class HotWebApi extends BaseWebApi {
Retrofit retrofit = getApi(baseUrl);
@Override
public T getServce() {
return (T) retrofit.create(HotWebServce.class);
}
}
3、使用:
HotWebApi hotWebApi = new HotWebApi();
HotWebServce webServce = hotWebApi.getServce();
Call call = webServce.getState("武汉");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, final Response response) {
……
}
@Override
public void onFailure(Call call, Throwable t) {
……
}
});
注:若需要打印url可使用:call.request().url().toString()
三、基于第二种方法并且减少创建的操作
封装Retrofit、CallBack
使用:
GetMovieService getMovieService =
RetrofitUtil.retrofit(MovieApi.MOIVE_API)
.create(GetMovieService.class);
Call call = getMovieService.getHotList("武汉");
call.enqueue(new MoiveCallback() {
@Override
public void onResponse(Call call, Response response) {
super.onResponse(call, response);
……
}
@Override
public void onFailure(Call call, Throwable t) {
super.onFailure(call, t);
}
});
四、Rxjava+Retrofit进行网络请求
1、什么是rxjava
RxJava 类似 观察者模式。有一个Observable(被观察者,事件的发起者)和一个观察者(Subscriber,事件的接收者)。Observable发出一系列的事件,然后Subscriber处理这些事件。Observable 可以发送零到多个事件。Subscriber会接收它发的每一个事件。如果Observable没有对应的Subscriber,不会发送任何事件。
本质上说:一个实现异步操作的库,并且随着程序逻辑越来越复杂,rxjava依旧能够保持简洁
2、为什么要用rxjava
3、使用
Service:
@GET("in_theaters")
Observable getHotList(@Query("city") String city);
retrofit部分:
//retrofit部分
public T create(Class service,String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //加这一句(很关键
.build()
.create(service);
}
使用方法一:
RxMoiveService rxMoiveService =
MoiveClient.getInstance()
.create(RxMoiveService.class,MovieApi.MOIVE_API);
rxMoiveService.getHotList("武汉")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(MoiveListGsonBean moiveListGsonBean) throws Exception {
……
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
……
}
});
使用方法二:
RxMoiveService rxMoiveService =
MoiveClient.getInstance()
.create(RxMoiveService.class,MovieApi.MOIVE_API);
rxMoiveService.getFutureList()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
}
@Override
public void onNext(MoiveListGsonBean value) {
Log.d(TAG, "onNext");
……
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError");
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
注:Consumer类:简易版本的Observer,可以自定义需要处理的信息
关于Rxjava的深入学习:给 Android 开发者的 RxJava 详解
Rxjava的github:ReactiveX/RxJava
RxAndroid的github:ReactiveX/RxAndroid