【RxJava】RxJava的生命周期管理
2017-03-16 13:49
225 查看
Rx 背后的理念是:无法知道事件流何时发射数据、也不知何时结束发射,但是你需要控制何时开始和结束接受事件。订阅者可能使用了一些资源,这些资源需要在停止接收事件的时候释放。 通过 subscription 可以实现生命周期管理。
Observable.subscribe 有好几个重载函数,每个函数都是某种情况的简化形式。
2
3
4
5
6
7
1
2
3
4
5
6
7
第一个 subscribe() 函数只是订阅事件,但是不去处理这些事件。带有一个或者多个 Action 参数的,使用这些参数来构造一个 Subscriber 对象。这些参数分别对应 onNext、onError和 onComplete 这三种类型的事件,如果没有提供则代表不处理这个类型的事件。
下面的示例演示处理 error 的情况:
2
3
4
5
6
7
1
2
3
4
5
6
7
输出结果:
2
3
1
2
3
如果你不处理 error,则 在发生错误的时候,会抛出 OnErrorNotImplementedException 异常。该异常发生在生产者这边,上面的示例 生产者和消费者位于同一线程,所以你可以直接 try- catch 住,但是在实际应用中,生产者和消费者通常不再同一个线程,所以最好还是提供一个 错误处理函数,否则你不知道错误发生了并导致事件流结束了。
在事件流结束发射之前,你可以主动停止接收事件。每个 subscribe 函数都会返回一个 Subscription 示例,该示例有两个函数:
2
1
2
只需要调用 unsubscribe 函数就可以停止接收数据了。
2
3
4
5
6
7
8
9
10 11
1
2
3
4
5
6
7
8
9
10 11
输出结果:
2
1
2
一个 observer 调用 unsubscribe 取消监听并不妨碍同一个 observable 上的其他 Observer 对象。
2
3
4
5
6
7
8
9
10 11
12
13
1
2
3
4
5
6
7
8
9
10 11
12
13
输出结果:
2
3
4
5
6
7
1
2
3
4
5
6
7
onError 和 onCompleted 意味着结束事件流。observable 需要遵守该规范,在 onError 或者 onCompleted 发生后就不应该再发射事件了。
2
3
4
5
6
7
8
9
10 11
1
2
3
4
5
6
7
8
9
10 11
结果:
2
3
4
1
2
3
4
Subscription 和其使用的资源绑定在一起。所以你应该记得释放 Subscription 来释放资源。使用 Subscriptions 的工厂函数可以把 Subscription 和需要的资源绑定在一起,然后可以使用 unsubscribe 来释放绑定的资源。
2
1
2
输出结果:
1
Subscriptions.create 函数需要一个 Action 接口类型参数,在 unsubscribe 调用的时候会执行该接口来释放资源。 也有其他一些函数可以简化开发:
Subscriptions.empty() 返回一个当 unsubscribe 的时候 啥也不做的Subscription 。当要求你返回一个 Subscription ,但是你确没有资源需要释放,则可以返回这个空的 Subscription。
Subscriptions.from(Subscription… subscriptions),返回的 Subscription 释放的时候,会调用所有参数 Subscription 的 unsubscribe 函数。
Subscriptions.unsubscribed() 返回一个已经释放过的 Subscription。
Subscription 也有一些标准的实现:
BooleanSubscription
CompositeSubscription
MultipleAssignmentSubscription
RefCountSubscription
SafeSubscriber
Scheduler.Worker
SerializedSubscriber
SerialSubscription
Subscriber
TestSubscriber
在后面将会看到他们的使用方式。这里注意 Subscriber 同时也实现了 Subscription。所以我们也可以直接用 Subscriber 来取消监听。
本文出自 云在千峰 http://blog.chengyunfeng.com/?p=954#ixzz4DV5maKAJ
Subscribing
Observable.subscribe 有好几个重载函数,每个函数都是某种情况的简化形式。Subscription subscribe() Subscription subscribe(Action1<? super T> onNext) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError, Action0 onComplete) Subscription subscribe(Observer<? super T> observer) Subscription subscribe(Subscriber<? super T> subscriber)1
2
3
4
5
6
7
1
2
3
4
5
6
7
第一个 subscribe() 函数只是订阅事件,但是不去处理这些事件。带有一个或者多个 Action 参数的,使用这些参数来构造一个 Subscriber 对象。这些参数分别对应 onNext、onError和 onComplete 这三种类型的事件,如果没有提供则代表不处理这个类型的事件。
下面的示例演示处理 error 的情况:
Subject<Integer, Integer> s = ReplaySubject.create(); s.subscribe( v -> System.out.println(v), e -> System.err.println(e)); s.onNext(0); s.onError(new Exception("Oops"));1
2
3
4
5
6
7
1
2
3
4
5
6
7
输出结果:
0 java.lang.Exception: Oops1
2
3
1
2
3
如果你不处理 error,则 在发生错误的时候,会抛出 OnErrorNotImplementedException 异常。该异常发生在生产者这边,上面的示例 生产者和消费者位于同一线程,所以你可以直接 try- catch 住,但是在实际应用中,生产者和消费者通常不再同一个线程,所以最好还是提供一个 错误处理函数,否则你不知道错误发生了并导致事件流结束了。
Unsubscribing
在事件流结束发射之前,你可以主动停止接收事件。每个 subscribe 函数都会返回一个 Subscription 示例,该示例有两个函数:boolean isUnsubscribed() void unsubscribe()1
2
1
2
只需要调用 unsubscribe 函数就可以停止接收数据了。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription = values.subscribe( v -> System.out.println(v), e -> System.err.println(e), () -> System.out.println("Done") ); values.onNext(0); values.onNext(1); subscription.unsubscribe(); values.onNext(2);1
2
3
4
5
6
7
8
9
10 11
1
2
3
4
5
6
7
8
9
10 11
输出结果:
0 11
2
1
2
一个 observer 调用 unsubscribe 取消监听并不妨碍同一个 observable 上的其他 Observer 对象。
Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe( v -> System.out.println("First: " + v) ); Subscription subscription2 = values.subscribe( v -> System.out.println("Second: " + v) ); values.onNext(0); values.onNext(1); subscription1.unsubscribe(); System.out.println("Unsubscribed first"); values.onNext(2);1
2
3
4
5
6
7
8
9
10 11
12
13
1
2
3
4
5
6
7
8
9
10 11
12
13
输出结果:
First: 0 Second: 0 First: 1 Second: 1 Unsubscribed first Second: 21
2
3
4
5
6
7
1
2
3
4
5
6
7
onError 和 onCompleted
onError 和 onCompleted 意味着结束事件流。observable 需要遵守该规范,在 onError 或者 onCompleted 发生后就不应该再发射事件了。Subject<Integer, Integer> values = ReplaySubject.create(); Subscription subscription1 = values.subscribe( v -> System.out.println("First: " + v), e -> System.out.println("First: " + e), () -> System.out.println("Completed") ); values.onNext(0); values.onNext(1); values.onCompleted(); values.onNext(2);1
2
3
4
5
6
7
8
9
10 11
1
2
3
4
5
6
7
8
9
10 11
结果:
First: 0 First: 1 Completed1
2
3
4
1
2
3
4
释放资源
Subscription 和其使用的资源绑定在一起。所以你应该记得释放 Subscription 来释放资源。使用 Subscriptions 的工厂函数可以把 Subscription 和需要的资源绑定在一起,然后可以使用 unsubscribe 来释放绑定的资源。Subscription s = Subscriptions.create(() -> System.out.println("Clean")); s.unsubscribe();1
2
1
2
输出结果:
Clean1
1
Subscriptions.create 函数需要一个 Action 接口类型参数,在 unsubscribe 调用的时候会执行该接口来释放资源。 也有其他一些函数可以简化开发:
Subscriptions.empty() 返回一个当 unsubscribe 的时候 啥也不做的Subscription 。当要求你返回一个 Subscription ,但是你确没有资源需要释放,则可以返回这个空的 Subscription。
Subscriptions.from(Subscription… subscriptions),返回的 Subscription 释放的时候,会调用所有参数 Subscription 的 unsubscribe 函数。
Subscriptions.unsubscribed() 返回一个已经释放过的 Subscription。
Subscription 也有一些标准的实现:
BooleanSubscription
CompositeSubscription
MultipleAssignmentSubscription
RefCountSubscription
SafeSubscriber
Scheduler.Worker
SerializedSubscriber
SerialSubscription
Subscriber
TestSubscriber
在后面将会看到他们的使用方式。这里注意 Subscriber 同时也实现了 Subscription。所以我们也可以直接用 Subscriber 来取消监听。
本文出自 云在千峰 http://blog.chengyunfeng.com/?p=954#ixzz4DV5maKAJ
相关文章推荐
- RxJava中的Subject和常见的生命周期管理
- 打造RxJava生命周期管理框架RxLife
- Rxjava、RxAndroid的生命周期管理
- RxJava 教程第一部分:入门之 生命周期管理
- RxBus和RxManager管理rxJava的生命周期
- RxJava入门之生命周期管理
- 打造RxJava生命周期管理框架RxLife
- RxJava入门之生命周期管理
- zuul源码分析之Request生命周期管理
- spring容器对bean生命周期的管理三中方式
- 谈业务流程全生命周期管理支撑业务流程再造(3)
- Spring实现bean生命周期管理
- Atitit 几大研发体系对比 Stage-Gate体系 PACE与IPD体系 敏捷开发体系 CMMI体系 艾龙 著 1. 3. 1.5:业界领先的研发管理体系简介 2 1 2. 《产品及生命周期
- 使用连接生命周期管理扩展连接池功能
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- 项目管理框架,生命周期与组织,管理过程,项目管理知识领,项目经理应具备的技能和素质
- Microsoft .Net Remoting系列专题之二 (对象管理及生命周期)
- Visual Studio 2013在软件生命周期管理上的改进
- Java实现生命周期管理机制
- Android管理服务(Service)的生命周期(lifecycle)