RxJava操作符实践:6_辅助操作之11_using

一、描述

创建一个只在Observable生命周期内存在的一次性资源。

Using操作符让你可以指示Observable创建一个只在它的生命周期内存在的资源,当Observable终止时这个资源会被自动释放。

using操作符接受三个参数:

  1. 一个用户创建一次性资源的工厂函数
  2. 一个用于创建Observable的工厂函数
  3. 一个用于释放资源的函数

当一个观察者订阅using返回的Observable时,using将会使用Observable工厂函数创建观察者要观察的Observable,同时使用资源工厂函数创建一个你想要创建的资源。当观察者取消订阅这个Observable时,或者当观察者终止时(无论是正常终止还是因错误而终止),using使用第三个函数释放它创建的资源。

using默认不在任何特定的调度器上执行。

二、示意图

using

三、示例代码

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
36
37
38
39
40
41
42
43
44
class Animal {
public Animal() {
System.out.println("Animal create.");
}

public void release() {
System.out.println("Animal release.");
}
}

Observable.using(new Func0<Animal>() {
@Override
public Animal call() {
return new Animal();
}
},
new Func1<Animal, Observable<?>>() {
@Override
public Observable<?> call(Animal animal) {
return Observable.timer(5000, TimeUnit.MILLISECONDS);
}
},
new Action1<Animal>() {
@Override
public void call(Animal animal) {
animal.release();
}
})
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
System.out.println("onCompleted.");
}

@Override
public void onError(Throwable e) {
System.out.println("onError: " + e.getMessage());
}

@Override
public void onNext(Object o) {
System.out.println("onNext: " + o);
}
});

四、运行结果

1
2
3
4
Animal create.
onNext: 0
onCompleted.
Animal release.

从运行结果可以看出,经过5秒后,timer发射了一个数据项,Observable就终止了,using就使用第三个函数释放它创建的资源。

五、参考资料

ReactiveX官方文档

ReactiveX文档中文翻译

PS:欢迎关注 SherlockShi 个人博客

感谢你的支持,让我继续努力分享有用的技术和知识点!