一、引言
Retrofit+Rxjava+MVP已经出来很长一段时间了,一直以来只是懂一些皮毛,最近静下来学习了一下。决定总结一下使用的方法,于是有了本系列使用小记,这是第一篇。本文仅供参考学习,如有不妥之处,还望批评指正。
二、基本内容介绍
2.1 Retrofit的使用方法教程很多,这里就不细究了,主要记录几点:
2.1.1 Retrofit可以使用常规的Call/CallBack方式来处理网络请求的返回值,使用同步/异步方式发起请求。比如说通常看到的这种:
/* 1.创建Retrofit实例*/
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
Retrofit mRetrofit = new Retrofit.Builder()
.client(httpClientBuilder.build())
.baseUrl("https://api.douban.com/v2/")
.addConverterFactory(GsonConverterFactory.create())
.build();
/* 2.关联请求服务(一个接口,而非真正的服务) */
RetrofitService service = mRetrofit.create(RetrofitService.class);
/* 3.创建请求实例*/
Call<Book> call = service.getSearchBook("Java编程思想", null, 0, 1);
/* 4.将请求放入请求队列(execute同步,enqueue异步),获得返回数据*/
call.enqueue(new Callback<Book>() {
@Override
public void onResponse(Call<Book> call, Response<Book> response) {
text.setText(response.body()+"");
}
@Override
public void onFailure(Call<Book> call, Throwable t) {
}
});
/* 那个名字是服务的接口*/
public interface RetrofitService {
@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name,
@Query("tag") String tag,
@Query("start") int start,
@Query("count") int count);
}
2.1.2 Retrofit可以使用Rxjava作为回调适配器、线程管理器,以观察者模式(Observer/Observable)来处理网络请求返回值。
/*这里写与上面的区别之处*/
/* 1.首先,是RetrofitService返回值不同,观察者模式返回的不是请求Call<T>,而是Observalble<T>*/
@GET("book/search")
Observalable<Book> getSearchBook(@Query("q") String name,
@Query("tag") String tag,
@Query("start") int start,
@Query("count") int count);
/* 2.创建Retrofit实例的时候,指定的是Rxjava的适配器*/
public class HttpMethods {
/*...可以私有化构造方法,使用getInstance()单例模式*/
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
mRetrofit = new Retrofit.Builder()
.client(httpClientBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
// RxJava2CallAdapter!
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(Constants.Url.BASEURL)
.build();
}
/* 3.1 可以指定请求过程、回调结果运行的线程;
* 3.2 以一种订阅的关联方式,联结请求和返回值;
* 3.3 返回值回调由Consumer<T>对象的accept()承担, Action承担完成后的处理。
* (Consumer<Json2DataBean>、Consumer<Throwable>等)
*/
service.getSearchBook("Java编程思想", null, 0, 1)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dataConsumer, errorConsumer, completeAction);
HttpMethods.getInstance()
.getSearchBook(
new Consumer<Book>() {
@Override
public void accept(Book response) throws Exception {
Log.d(RRTAG, "response=" + response.toString());
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d(RRTAG, "throw=" + throwable);
}
},
new Action() {
@Override
public void run() throws Exception {
Log.d(RRTAG, "complete!");
}
},
"Java编程思想",
null,
0,
1);
2.1.3 Retrofit通常使用注解的方式来请求。
常见的注解有:
@GET
@POST
@Path/@Query/@QueryMap/@Body/@BodyMap/@Header/@HeaderMap/@FormUrlEncoded等
2.2 RxJava:
2.2.1 RxJava2.0优点
1. 使用的主要好处是简化了先前适配器的队列、线程管理;
2. 简化了回调数据转化Java对象的过程;
3. 使复杂的网络请求逻辑简化;
4. 合适封装多个相似的网络请求。
2.2.1 RxJava2.0原理
这篇文章写的非常详细。
2.3 MVP