Retrofit+Rxjava结合使用(三)
来源:互联网 发布:法语入门软件 编辑:程序博客网 时间:2024/06/03 20:37
1.Rxjava的介绍
根据github官方介绍“a library for composing asynchronous and event-based programs using observable sequences for the Java VM“,我来翻译哈,Rxjava是一个在java虚拟机上使用可观测的序列实现异步和基于事件驱动的库,说到底,Rxjava就是应用于java语言中的一个实现异步且基于事件驱动的工具库,这下概念搞明白了,不晓得你搞明白没,反正我是明白了。
2.Rxjava的原理
Rxjava是一种扩展式的观察者模式,但与最初的观察者模式又有些差异。那么,到底怎么回事呢?莫急,听我慢慢分解:
通俗点讲,Rxjava这种扩展式的观察者模式,需要被观察者(Observable)在状态改变的时候通知观察者(Observer),继而观察者引发一系列的动作。这种模式听起来很奇怪,就像警察抓小偷一样,在小偷实行偷取东西,小偷必须通知警察,然后警察才能实行抓捕行动,貌似警察方显格外的被动了,不过没办法,这就是我们要学习的Rxjava的原理。
Observable-------subscribe-----------》observer
3.Rxjava重点解析
1.Observer的创建
//创建观察者final Observer<String> myObserver = new Observer<String>() { @Override public void onCompleted() { System.out.println("completed"); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(String s) { System.out.println(s); }};2.Observable的创建
//创建被观察者Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { myObserver.onNext("hello"); myObserver.onNext("world"); myObserver.onNext("zhangxing"); myObserver.onCompleted(); }});3.实现两者的订阅(绑定)
//实现订阅关系myObservable.subscribe(myObserver);
4.Rxjava重要operators的解析
1.just:将传入的参数依次发送出来
Observable.just("zhangxing","helloworld") 等同于://onNext("zhangixng"); //onNext("helloworld"); //onCompleted();2.from ( T[ ] ):将传入的数组或Iterable拆分成具体对象后传出来
String[] words = {"Hello", "Hi", "Aloha"}; Observable observable = Observable.from(words); 等同于 // 将会依次调用: // onNext("Hello"); // onNext("Hi"); // onNext("Aloha"); // onCompleted();3.map:可以传出一个新的数据类型的Observable对象
Observable.just("zhangxing","helloworld") .map(new Func1<String,Integer>() { @Override public Integer call(String s) { return s.hashCode(); } })4.flatMap:接收一个Observable输出作为入参,同时输出另一个Observable对象
没用flatMap之前:
Observable.from(words) .subscribe(new Action1<String>() { @Override public void call(String s) { Observable.from(wordss) .subscribe(new Action1<String>() { @Override public void call(String word) { newsTv.setText(word); } }); } });用了flatMap之后
final String[] wordss = new String[]{"hello","zhangixng"};Observable.from(words) .flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> word) { return Observable.from(word) ; } );是不是代码简洁了很多,哈哈,这就是它的强大之处,这个操作符也是Rxjava的重中之重,虽然理解起来有点难度,但是一旦理解,后果不堪设想,哈哈!
5.filter:过滤一些不满足条件的结果
query("Hello, world!").flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .filter(title -> title != null) .take(5) .doOnNext(title -> saveTitle(title)) .subscribe(title -> System.out.println(title));6.take:输出最多指定数量的结果
上段代码也演示了take的功能,这里就不赘述了。
7.doOnNext():在输出一个元素之前做一些额外的事情。
在第5段代码中,允许我们在每次输出一个元素之前做一些额外的事情,比如这里的保存标题
5.Retrofit与Rxjava的完美结合
1.build.gradle中添加配置:
compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:converter-gson:2.1.0'compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'compile 'io.reactivex:rxandroid:1.1.0'compile 'io.reactivex:rxjava:1.1.0'2.申明接口类:
public interface APIService { @GET("index") Observable<TopNews> getNews(@Query("type") String type, @Query("key")String key);}这时的TopNew的修饰符就是Observable了,注意了不再是Call了哦!!
3.javaBean的生成(我这里采用聚合数据的头条新闻的接口)
public class TopNews implements Serializable { private String reason; private ResultBean result; private int error_code; public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public ResultBean getResult() { return result; } public void setResult(ResultBean result) { this.result = result; } public int getError_code() { return error_code; } public void setError_code(int error_code) { this.error_code = error_code; } public static class ResultBean { private String stat; /** * title : 多么痛的领悟!河南一对情侣同居生子没领证 男方几年后另觅新欢 * date : 2016-10-16 17:37 * category : 社会 * author_name : 台海网 * thumbnail_pic_s : http://02.imgmini.eastday.com/mobile/20161016/20161016173718_d2ea108abd6ed284b35e0e6c7327635f_1_mwpm_03200403.jpeg * url : http://mini.eastday.com/mobile/161016173718330.html?qid=juheshuju * thumbnail_pic_s03 : http://02.imgmini.eastday.com/mobile/20161016/20161016173718_d2ea108abd6ed284b35e0e6c7327635f_1_mwpl_05500201.jpeg */ private List<DataBean> data; public String getStat() { return stat; } public void setStat(String stat) { this.stat = stat; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private String title; private String date; private String category; private String author_name; private String thumbnail_pic_s; private String url; private String thumbnail_pic_s03; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getAuthor_name() { return author_name; } public void setAuthor_name(String author_name) { this.author_name = author_name; } public String getThumbnail_pic_s() { return thumbnail_pic_s; } public void setThumbnail_pic_s(String thumbnail_pic_s) { this.thumbnail_pic_s = thumbnail_pic_s; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getThumbnail_pic_s03() { return thumbnail_pic_s03; } public void setThumbnail_pic_s03(String thumbnail_pic_s03) { this.thumbnail_pic_s03 = thumbnail_pic_s03; } } }}4,.请求代码的实现:
public void captureNews(View view){ Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://v.juhe.cn/toutiao/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); APIService service = retrofit.create(APIService.class); service.getNews("shehui","2be4390ab0c91110e4cde2edfddad05d") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<TopNews>() { @Override public void onCompleted() { Toast.makeText(MainActivity.this, "Get Top News Completed", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(TopNews topNews) { newsTv.setText(topNews.getResult().getData().get(1).getTitle()); } });}效果图:
好了,请求成功了,今天就到这里了,大家有什么问题的话,私信我,我是张星,欢迎关注!!
- Retrofit+Rxjava结合使用(三)
- RxJava + Retrofit 结合使用
- Retrofit结合rxjava使用
- Retrofit 和 RxJava 结合使用
- RxJava,Retrofit,OkHttp3结合使用
- Retrofit和RxJava结合使用
- RxJava和Retrofit结合使用
- RxJava和Retrofit结合使用
- Retrofit + RxJava 的结合使用
- Retrofit与Rxjava结合使用
- rxjava 和retrofit 结合使用
- Retrofit结合Rxjava初步使用
- 对Rxjava的理解以及结合Retrofit使用(一)
- RxJava2笔记(3)—RxJava结合Retrofit使用
- Android 中 Retrofit 结合 RxJava使用
- Android RxJava/RxAndroid结合Retrofit使用
- Retrofit和RxJava结合使用例子分析
- RxJava和Retrofit结合使用详解
- IDEA构建maven速度很慢问题
- Java中调用一个方法的范围值作为形参传给另一个方法
- MySQL中myisam和innodb的主键索引有什么区别?
- 从零开始学GitHub【第二篇】
- tstools
- Retrofit+Rxjava结合使用(三)
- 带缓存的和不带缓存的I/O操作
- C语言练习题-字符串中找连续最长字符串
- Codeforces Round #372 (Div. 2) E. Digit Tree (点分治)
- codeforces 731C 并查集+贪心
- 文章标题
- tsplay
- Android 异步编程
- C#颜色和名称样式对照表