美文网首页Android-RxJavaAndroid-Rxjava&retrofit&dagger
RXJAVA取消订阅最优封装-kotlin-Android

RXJAVA取消订阅最优封装-kotlin-Android

作者: sjj_dot | 来源:发表于2018-07-07 15:31 被阅读83次

rxjava取消订阅--利用kotlin的扩展方法和android的lifecycle库实现
lifecycle库在27之后的support包包含不需要单独导入之前的版本可以前往Android官网查看文档

下面直接上代码:

扩展方法封装

import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleObserver
import android.arch.lifecycle.OnLifecycleEvent
import io.reactivex.disposables.Disposable
import java.util.*
import kotlin.collections.HashMap

private val map = Collections.synchronizedMap(HashMap<String, BaseLifecycleObserver>())

fun Disposable.destroy(onceKey: String? = null, lifecycle: Lifecycle) {
    lifecycle.addObserver(BaseLifecycleObserver(this, lifecycle, onceKey, Lifecycle.Event.ON_DESTROY))
}

fun Disposable.stop(onceKey: String? = null, lifecycle: Lifecycle) {
    lifecycle.addObserver(BaseLifecycleObserver(this, lifecycle, onceKey, Lifecycle.Event.ON_STOP))
}

fun Disposable.pause(onceKey: String? = null, lifecycle: Lifecycle) {
    lifecycle.addObserver(BaseLifecycleObserver(this, lifecycle, onceKey, Lifecycle.Event.ON_PAUSE))
}

class BaseLifecycleObserver(val disposable: Disposable,
                            private val lifecycle: Lifecycle,
                            private val onceKey: String? = null,
                            private val event: Lifecycle.Event = Lifecycle.Event.ON_DESTROY) : LifecycleObserver {
    init {
        if (onceKey != null) {
            val observer = map.remove(onceKey)
            map[onceKey] = this
            if (observer != null) {
                observer.disposable.dispose()
                lifecycle.removeObserver(observer)
            }
        }
        lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop() {
        if (event == Lifecycle.Event.ON_STOP) {
            clean()
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        if (event == Lifecycle.Event.ON_DESTROY) {
            clean()
        }
    }

    private fun clean() {
        disposable.dispose()
        if (onceKey != null)
            map.remove(onceKey)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        if (disposable.isDisposed) {
            lifecycle.removeObserver(this)
            if (onceKey != null)
                map.remove(onceKey)
        }
        if (event == Lifecycle.Event.ON_PAUSE) {
            clean()
        }
    }

}

这里主要声明了三个方法扩展destory、stop、pause
参数: oncekey ,唯一的key 如果重复的话会直接取消之前的disposeable 如果为null 则不处理
参数:lifecycle ,被绑定到的声明周期对象,通常由 activity 或者 fragment 提供,也可以自定义。
destory stop pause 三个扩展方法,表示在相应的生命周期 取消订阅。

BaseLifecycleObserver:这个应该叫 参数 Lifecycle 的 声明周期观察者 。内部通过传入的参数判断何时取消订阅。

不想码字了直接上代码吧。并不复杂只是一点点小技巧

使用(activity中也可以 或者如果有自定义的lifecycleowner 对象也可以)

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.View
import io.reactivex.Observable
import sjj.fiction.util.destroy
import sjj.fiction.util.pause

/**
 * Created by SJJ on 2017/10/7.
 */
open class BaseFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //当fragment 声明周期调用destroy 时会自动取消订阅

        Observable.just("a").subscribe {
            Log.e("a", "a")
        }.destroy(lifecycle = lifecycle)

        //重复调用自动取消上一次,某些时候很有用
        Observable.just("a").subscribe {
            Log.e("a", "a")
        }.destroy("onceaaakey",lifecycle = lifecycle)

        //当fragment 声明周期调用pause 时会自动取消订阅

        Observable.just("a").subscribe {
            Log.e("a", "a")
        }.pause(lifecycle = lifecycle)
    }

}

再进一步的封装

在activity或者fragment中添加扩展方法

import android.support.v4.app.Fragment
import io.reactivex.disposables.Disposable
import sjj.fiction.util.destroy
import sjj.fiction.util.pause
import sjj.fiction.util.stop

/**
 * Created by SJJ on 2017/10/7.
 */
open class BaseFragment : Fragment() {
    fun Disposable.destroy(onceKey: String? = null) {
        destroy(onceKey, lifecycle)
    }

    fun Disposable.stop(onceKey: String? = null) {
        stop(onceKey, lifecycle)
    }

    fun Disposable.pause(onceKey: String? = null) {
        pause(onceKey, lifecycle)
    }
}

这里在fragment中添加扩展方法之后在fragment中使用更加方便

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        Observable.just("a").subscribe { 
            
        }.destroy()
        Observable.just("a").subscribe {

        }.pause()
    }

ok 到此结束 以后再也不用被dispose折磨了

相关库源码(代码可以不能运行,但是一定要好看)
lifecycle 库更多 说明请前往官方网站查看

相关文章

网友评论

    本文标题:RXJAVA取消订阅最优封装-kotlin-Android

    本文链接:https://www.haomeiwen.com/subject/bqiwuftx.html