LiveData to RxJava
LiveDataToRxJava是一个语言扩展库,提供一些接口可以把LiveData转换成RxJava。
项目地址:https://github.com/YvesCheung/LiveDataToRxJava
使用
直接转换成Reactive接口
通过 kotlin 扩展函数,可以很方便地把 LiveData
转成 RxJava
:
val completable = liveData.toCompletable()
val observable = liveData.toObservable()
val flowable = liveData.toFlowable()
val single = liveData.toSingle()
val maybe = liveData.toMaybe()
如果是使用 Java,Api会略微冗长一点:
MutableLiveData<String> liveData = new MutableLiveData<>();
Completable completable = RxJavaConvert.toCompletable(liveData);
Observable<String> observable = RxJavaConvert.toObservable(liveData);
Flowable<String> flowable = RxJavaConvert.toFlowable(liveData);
Single<String> single = RxJavaConvert.toSingle(liveData);
Maybe<String> maybe = RxJavaConvert.toMaybe(liveData);
订阅的生命周期
LiveData
可以指定观察的期限在某一个 LifecycleOwner
的生命周期中。在 Android support-26 以上的包里,常用的 Activity
和 Fragment
都已经实现了 LifecycleOwner
这个接口,所以可以很方便地在 ui 有效的生命周期内使用我们的数据。
可以通过下面的Api来把 LifecycleOwner
转换成一个 Observable
:
//`this` can be an Activity or a Fragment
val observable: Observable<Lifecycle.Event> = LifecycleConvert.lifecycleObservable(this)
很多情况下,可以使用下面的Api来让你的可观察对象具有生命周期:
//`this` can be an Activity or a Fragment
val observableWithLife = observable.bindLifecycle(this)
val singleWithLife = single.bindLifecycle(this)
val maybeWithLife = maybe.bindLifecycle(this)
val flowableWithLife = flowable.bindLifecycle(this)
val completableWithLife = completable.bindLifecycle(this)
bindLifecycle
操作符可以让你的可观察对象具有与 LiveData.observe(this,{doSomething})
相同的生命周期,也就是从 onStart
状态到 onPause
状态。
绑定生命周期的操作符 不仅 适用于从
LiveData
转化而来的Observable
(或其他Reactive
接口)。所以你也可以用这个库来为其他RxJava
相关的行为绑定生命周期,比如Retrofit
的网络请求,当 ui 不再活跃的时候可以自动dispose
这个网络请求。
其他细节
空值
LiveData
与 Reactive
接口有个很大的差异,就是 LiveData
允许传递null值,而 Reactive
规范是不可以的。所以在转换到 RxJava
的过程中null值就会很尴尬。默认的 toObservable
等接口在遇到null值时会抛出一个异常。下面是几个我对此的建议:
- 定义一个代表null的常量或对象,在需要传递null值的地方使用该常量或对象。
- 使用Java8 Optional类包装
- 使用
toObservableAllowNull
系列的Api
val observable = liveData.toObservableAllowNull(valueIfNull)
val single = liveData.toSingleAllowNull(valueIfNull)
val maybe = liveData.toMaybeAllowNull(valueIfNull)
val flowable = liveData.toFlowableAllowNull(valueIfNull)
val completable = liveData.toCompletableAllowNull()
非线程安全
LiveData
是非线程安全的。observe
, observeForever
, removeObserver
, setValue
等主要方法都需要在主线程上调用。这意味着转换成 Observable
接口之后还是必须在主线程中订阅。这是令人遗憾但暂时无法避免的。
生命周期以外的值传递
当 Flowable
或者 Observable
在生命周期之外期间发射值的时候,这些值会被无视掉。但是对于 Single
来说,那唯一可怜的值如果被无视掉的话,就相当于是 Maybe
了:
val maybe = single.bindLifecycle(this)
而如果还是希望绑定生命周期之后仍然是对 Single
进行操作,可以这样:
val singleWithLife = single.bindLifecycleWithError(this)
在生命周期以外发射值的话,会抛出一个 CancellationException
。 Completable
是一样道理的。
配置
在项目根目录build.gradle添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在需要使用该库的module的build.gradle添加:
dependencies {
compile 'com.github.YvesCheung:LiveDataToRxJava:v1.1'
}
许可证
Copyright 2018 Yves Cheung
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.