【发布时间】:2019-01-04 19:48:11
【问题描述】:
我们想观察视图大小的变化,我们创建一个这样的扩展:
fun View.layoutSizeObservable(): io.reactivex.Observable<Size> {
return io.reactivex.Observable.create<Size> { emitter ->
viewTreeObserver.addOnGlobalLayoutListener {
Log.d("MainFragment", "ViewTreeObserver Listener called back.")
if (measuredWidth > 0 && measuredHeight > 0) {
emitter.onNext(Size(measuredWidth, measuredHeight))
}
}
}
}
然后我们像这样使用它,它在功能上运行良好:
sizeChangedDisposable = titleTextView.layoutSizeObservable().subscribe { size: Size ->
Log.d("MainFragment", "Size changed subscribe on $size")
}
然而,我们不想要的一件事是Listener 是通过addOnGlobalLayoutListener 添加的,但从未删除。
我们可以拨打sizeChangedDisposable.dispose(),它会正确停止订阅:
D/MainFragment:在 $size 上更改订阅大小
但这将继续被调用:
D/MainFragment:ViewTreeObserver 监听器回调。
我们如何以及在哪里删除布局侦听器回调?
【问题讨论】: