rxjava 优雅的取消订阅。 (kotlin)

使用kotlin的扩展方法。 封装 (前面是rxbus的单例对象,实际基本不使用)


val processor = PublishProcessor.create<Any>().toSerialized()
private val map = WeakHashMap<String, MLifecycleObserver>() //Collections.synchronizedMap(WeakHashMap<String, MLifecycleObserver>())
fun rxPush(o: Any) {
    processor.onNext(o)
}

inline fun <reified T> rxOfType() = processor.ofType(T::class.java)

fun Disposable.auto(onceKey: String? = null,lifecycle: Lifecycle) {
    val ob = MLifecycleObserver(this,lifecycle)
    if (onceKey != null) {
        val observer = map.remove(onceKey)
        map[onceKey] = ob
        if (observer != null) {
            observer.disposable.dispose()
            lifecycle.removeObserver(observer)
        }
    }
    lifecycle.addObserver(ob)
}

class MLifecycleObserver(val disposable: Disposable, private val lifecycle: Lifecycle) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        disposable.dispose()
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        if (disposable.isDisposed) {
            lifecycle.removeObserver(this)
        }
    }

}

进一步封装和使用。在fragment 和activity中封装后使用更方便

class BaseFragment: Fragment() {
    fun Disposable.auto(onceKey: String? = null){
        auto(onceKey,lifecycle)
    }
}
class BaseDialogFragment : DialogFragment() {
    fun Disposable.auto(onceKey: String? = null){
        auto(onceKey,lifecycle)
    }
}
class BaseActivity : AppCompatActivity() {
    fun Disposable.auto(onceKey: String? = null){
        auto(onceKey,lifecycle)
    }
}
//在activity或者是fragment中使用  也可以在其他地方传入lifecycle对象。或者自定义LifecycleObserver 对象
rxOfType<Any>().subscribe{

 }.auto()

更多

转载于:https://my.oschina.net/SSS555/blog/1831495

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值