如果是简单的网络请求,那么任何一个主流的网络框架都能够胜任,有一种情况是其它网络框架可以胜任,但是写出来是巨丑无比的,就是在需要嵌套请求的时候。
假设需要先get一个地址,获取一个key,然后通过这个key组合一个新的url,再get这个新的url,获取结果(简单的单层嵌套),下面是普通框架与retrofit + rxjava的代码
一 : 普通网络框架嵌套请求的伪代码
request.get(url,new callback() {
public onSuccess(Response response) {
String key = response.body().getKey();
String newUrl = url + "?key=" + key;
new Request.get(newUrl, new callback() {
public onSuccess(Response response) {
//todo something with response
}
public onFalied(String error) {
Log.e(TAG, "onFalied: " error);
}
});
}
public onFalied(String error) {
Log.e(TAG, "onFalied: " error);
}
});
二 :retrofit + rxjava(下面以showapi上的唯一小说接口为例)
接口:
假设我们需要查看斗破苍穹这本书的第一章,我们先需要搜索这本小说(万一没有呢).
为了简便,以获取的所有书目的第一个为准
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://route.showapi.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
IBookService bookService = retrofit.create(IBookService.class);
bookService.getBooksByKeyWord("斗破苍穹")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<BookEntity>() {
@Override
public void call(BookEntity bookEntity) {
Log.e(TAG, "call: " + bookEntity.getShowapi_res_body().getPagebean().getContentlist().get(0).getName());
}
});
可以看出rxjava可以很方便的转换线程
下面就是rxjava的强大之处,我们要根据获取到的书的id再获取所有章节目录,只需要改动很少的代码
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://route.showapi.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
final IBookService bookService = retrofit.create(IBookService.class);
bookService.getBooksByKeyWord("斗破苍穹")
.subscribeOn(Schedulers.io())
.flatMap(new Func1<BookEntity, Observable<ItemBookEntity>>() {
@Override
public Observable<ItemBookEntity> call(BookEntity bookEntity) {
String id = bookEntity.getShowapi_res_body().getPagebean().getContentlist().get(0).getId();
return bookService.getBookById(id);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ItemBookEntity>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onNext(ItemBookEntity itemBookEntity) {
for (ChapterListBean chapter : itemBookEntity.getShowapi_res_body().getBook().getChapterList()) {
Log.e(TAG, "call: " + chapter.getName());
}
}
});
为了可以捕捉异常,所以最后用了一个完整的Subscriber
rxjava可以将转换一系列的事件与对象,如果只是普通对象的转换,只需要用map就可以了,如果需要事件的转换,可以用flatMap,那么即使事件过程中需要转换再多次,代码完全写下来,逻辑还是很清楚的,不会因为过多的嵌套而变得特别难阅读。