RxJava的初学随笔(二)
来源:互联网 发布:淘宝店代运营可靠吗 编辑:程序博客网 时间:2024/06/05 11:57
~
一、关于Retrofit初始化
Retrofit1.0和Retrofit2.0在初始化上有一些细微的变化,我们先来看下代码
Retrofit1.0
public static CustomApiInterface getCustomApiClient(Class<?> mClass, boolean isCache) { RestAdapter restAdapter = new RestAdapter.Builder() .setErrorHandler(retrofitErrorHandler) .setEndpoint(URLs.ROOT_URL) .setRequestInterceptor(requestInterceptor) .setConverter(new ApiConverter(mClass)) // 是否缓存本次请求 .setClient(new CachingClient(isCache)) .build(); mServiceApi = restAdapter.create(CustomApiInterface.class);
return customApiInterface;
mServiceApi = restAdapter.create(CustomApiInterface.class);return customApiInterface;
Retrofit2.0
@Injectpublic RestDataSource() { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(loggingInterceptor).build(); Retrofit AdapterApi = new Retrofit.Builder().baseUrl(ServiceApi.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client) .build(); mServiceApi = AdapterApi.create(ServiceApi.class);}
1.可以明显的看到在Retrofit1.0中RestAdapter到2.0中名称直接改为Retrofit,这样从名称来看显得更直观了。
2.1.0中setEndponit到2.0改为baseUrl。
3.设置Interceptro(拦截器)这点改动比较大,在1.0中是直接设置的,而在2.0中需要先设置网络客户端,然后在网络客户端中设置Interceptro。这点改动主要原因是,1.0的时候 Retrofit可以设置其他网络客户端,而到了2.0直接将okhttp设置为默认网络客户端,所以设置拦截器的步骤就在okhttp中了。4.addCallAdapterFactory(RxJavaCallAdapterFactory.create())表示支持RxJava。二、关于RxJava的Schedulers(调度器) 我们知道Rxjava引入了Schedulers的概念,通过Schedulers可以调度线程,这样大大方便了我们多线程开发。比如我们用Retrofit+Rxjava生成一个网络接口时,可以这样做 @Overridepublic Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());}
可以从代码中看出,出现了这两个方法subscribeOn(Schedulers.io) 、observeOn(AndroidSchedulers.mainThread())。第一个方法表示被观察者在产生信息时所在的线程,第二个方法表示订阅者在订阅后消费信息时所在的线程。这两个方法就是Rxjava的最基本线程调度功能,请求数据的时候在io线程,数据请求成功后在AndroidUi线程更新界面,这样是不是比起以前的开启一个新线程请求接口,然后写一个回调到ui线程的接口方便很多呢。 然后在实际使用中还是有些小细节需要处理,比如在请求网络接口时,在准备阶段我们会show一个Progress表示网络等待,但是使用subscribeOn(Schedulers.io())后把整个准备阶段都纳入了io线程,但是我们showProgerss需要在UI线程,如果直接showProgerss会导致线程非法,所以这里需要用到Observable.doOnSubscribe(),doOnSubscribe()中的动作执行在subscribe()发生的线程中,而如果doOnSubscribe()之后又subscribeOn()的话,doOnSubscribe将执行在离它最近的subscribeOn()指定的线程中,所以我们可以这样改动一下代码。 @Override public Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() { @Override public void call() {// showProgerss(); } }).subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()); }
至此就达到了在准备阶段showProgerss的功能。
Retrofit2.0
@Injectpublic RestDataSource() { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(loggingInterceptor).build(); Retrofit AdapterApi = new Retrofit.Builder().baseUrl(ServiceApi.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client) .build(); mServiceApi = AdapterApi.create(ServiceApi.class);}
1.可以明显的看到在Retrofit1.0中RestAdapter到2.0中名称直接改为Retrofit,这样从名称来看显得更直观了。
2.1.0中setEndponit到2.0改为baseUrl。
3.设置Interceptro(拦截器)这点改动比较大,在1.0中是直接设置的,而在2.0中需要先设置网络客户端,然后在网络客户端中设置Interceptro。这点改动主要原因是,1.0的时候
Retrofit可以设置其他网络客户端,而到了2.0直接将okhttp设置为默认网络客户端,所以设置拦截器的步骤就在okhttp中了。
4.addCallAdapterFactory(RxJavaCallAdapterFactory.create())表示支持RxJava。
@Overridepublic Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());}
@Override public Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() { @Override public void call() {// showProgerss(); } }).subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()); }
0 0
- RxJava的初学随笔(二)
- RxJava的初学随笔(一)
- RxJava的初学随笔(三)
- RxJava的初学随笔(四)
- 初学 retrofit2与RXJava 的搭配使用
- RxJava的基础使用(二)
- 关于Dragger2与RXjava集合框架的项目随笔
- rxjava初学笔记
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Python初学随笔
- 初学java随笔
- 关于技术更新随笔,给初学编程的一点经验
- S3C2440 VxWorks移植随笔--初学容易忽视的地方
- 手绘随笔:随笔(二)
- RxJava的使用基础教学 二
- 设计模式(3)——工厂方法模式
- Java泛型类型参数的界限
- EF 错误LINQ to Entities 不识别方法“Int32 ToInt32(System.String)
- 位域
- ThingWorx : 3、为Thing添加valueStream(web显示曲线做准备)
- RxJava的初学随笔(二)
- 设计模式(4)——抽象工厂模式
- Android Studio :Error:(1, 0) Plugin is too old, please update to a more recent version, or set AND……
- iOS开发--根据label内容动态设定label大小
- 链表的反转
- TCP/IP、Http、Socket的区别
- python读取mnist
- 第一行代码-13.3 定制自己的日志工具
- Android <shape />的使用