从零开始的RxJava2.0教程(四)在安卓中的应用

来源:互联网 发布:苹果手机蓝牙软件 编辑:程序博客网 时间:2024/06/03 11:02

1. 前言

在第1 2 3篇中,我介绍了RxJava 2.0的基本用法。这一篇将介绍在安卓中的基本用法。 
附上本系列教程的链接。 
从零开始的RxJava2.0教程(一)基础 
从零开始的RxJava2.0教程(二)操作符 
从零开始的RxJava2.0教程(三)响应式的好处 
从零开始的RxJava2.0教程(四)在安卓中的应用

2. RxAndroid

RxAndroid是RxJava针对Android平台的扩展库。

曾几何时,RxAndroid确实提供了很多的实用的方法,但后来社区上很多人对这库的结构有意见,然后作者便进行了重构,现在只保留了AndroidSchedulers, 现在基本RxAndroid只有一个功能,那就是AndroidSchedulers.mainThread 方法用于指定主线程。

以前那些类被划分到了其他一些Rx库,比如 RxBindingRxLifecycle。这里我并不打算介绍,因为对于新手来说,为时太早,如果你有兴趣,可以自己查阅相关资料。

3. 配合 Retrofit 2

目前来说,Android的网络库基本被 Retrofit + OkHttp 一统天下了。因为它确实很优秀。

当然,RxJava的影响力也不容小觑,Retrofit 也提供了对RxJava 的支持,截止到目前(2016.11.06)为止,官方似乎还没有支持RxJava 2.0。不过你不用担心,已经有大神帮我们做好了。

要使用 Retrofit 需要引入对应的库。

compile 'com.squareup.okhttp3:okhttp:3.4.1'compile 'com.squareup.okio:okio:1.10.0'compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

retrofit2 依赖于 okhttp3,而 okhttp3 又依赖于okio。最后一项便是大神写好的 retrofit2-rxjava2-adapter 适配器啦。

假设我们现在需要去获取百度页面的html代码。

public interface BaiDuService {    @GET("/")    Flowable<ResponseBody> getText();}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

定义好请求接口。注意,返回值是 Flowable 类型。

Retrofit retrofit = new Retrofit.Builder()        .baseUrl("http://www.baidu.com/")        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())// 添加RxJava2的适配器支持        .build();BaiDuService service = retrofit.create(BaiDuService.class);service.getText()        .subscribeOn(Schedulers.newThread())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Subscriber<ResponseBody>() {            @Override            public void onSubscribe(Subscription s) {                s.request(Long.MAX_VALUE);            }            @Override            public void onNext(ResponseBody s) {                Toast.makeText(RxJava2Activity.this, "获取成功", Toast.LENGTH_SHORT).show();                try {                    System.out.println(s.string());                } catch (IOException e) {                    e.printStackTrace();                }            }            @Override            public void onError(Throwable t) {                t.printStackTrace();                Toast.makeText(RxJava2Activity.this, "获取失败,请检查网络是否畅通", Toast.LENGTH_SHORT).show();            }            @Override            public void onComplete() {                System.out.println("任务结束");            }        });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在创建 Retrofit 的时候添加对 RxJava 2 的适配器,这样,请求就可以直接返回 Flowable。 然后就可以进行 RxJava 2 的操作了。

4. 从RxJava 2中获取数据

前面我介绍了可以通过 fromX 的方法把数组、列表等数据发射出去。那么有没有办法直接把发射的数据获取出来而不是通过订阅者来输出呢?

List<String> ids = Flowable.range(1, 100)        .map(new Function<Integer, String>() {            @Override            public String apply(Integer integer) throws Exception {                return "id:" + integer;            }        })        .toList().blockingGet();System.out.println(ids);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

比如这里,我发射了1到100总计100个数据,我们可以通过 blockingX 方法来拿到这些数据。

5. 结束

本系列教程到此结束,但我介绍的仅仅只是 RxJava 的冰山一角,如果你有更高的需求,请查阅其他资料。

感谢您的阅读。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 六角头冲得不标准怎么办 滚丝杆烫手怎么办怎样能不烫手 带滚花的杆子里面脏怎么办 田螺和玉米吃了怎么办 lv包包螺丝掉了怎么办 螺狮那一段吃了怎么办 吃了不熟的田螺怎么办 包上的螺丝掉了怎么办 工厂打螺丝手疼怎么办 打螺丝打到手痛怎么办 欧曼gtl不烧尿素怎么办 放油螺丝滑牙怎么办 蝴蝶刀螺丝松了怎么办 婴儿车铆钉松了怎么办 扇子上的铆钉松怎么办 锅的把手松了怎么办 奶锅把手松了怎么办 锅的手柄烧坏了怎么办 鞋子上的铆钉生锈了怎么办 包包上的铆钉生锈了怎么办 凉鞋的铆钉生锈了怎么办 扇子的铆钉坏了怎么办 包包的铆钉坏了怎么办 汽车半轴螺丝母拧不动怎么办? 卫衣袖子短了怎么办 u型导轨蚊帐下垂怎么办 100的水管螺纹出漏水怎么办 吊顶螺丝没有防锈处理怎么办 膨胀螺丝洞松了怎么办 膨胀螺丝眼大了怎么办 墙上螺丝孔大了怎么办 膨胀螺丝孔深了怎么办 克霉膨胀栓的线怎么办 摩托车排气管螺丝断了怎么办 汽车轮胎螺丝卸不下来怎么办 内六角螺丝卸不下来怎么办 洗衣机六角螺丝卸不动怎么办 黄油嘴打不进去怎么办 螺杆冷水机氟系统有空气怎么办 脚踏式加油枪皮碗不下去怎么办? 自攻螺丝滑丝怎么办?