使用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()