使用Rx Java时,Android视图在旋转后为空
我正在使用Kotlin Android扩展访问片段中的所有视图,这些视图按预期工作,即使在屏幕旋转后也可以正常访问 当我尝试访问Rx Java可观察间隔内的视图时,问题开始了,如下所示:使用Rx Java时,Android视图在旋转后为空,android,kotlin,rx-java2,kotlin-android-extensions,Android,Kotlin,Rx Java2,Kotlin Android Extensions,我正在使用Kotlin Android扩展访问片段中的所有视图,这些视图按预期工作,即使在屏幕旋转后也可以正常访问 当我尝试访问Rx Java可观察间隔内的视图时,问题开始了,如下所示: var interval = Observable.interval(10, TimeUnit.SECONDS, Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) interval.retry().subscribe {
var interval = Observable.interval(10, TimeUnit.SECONDS, Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
interval.retry().subscribe { updateUi(); }
如果我在间隔之间旋转屏幕。下次updateUi()方法作为observable的一部分运行时,其中的视图将为null,应用程序将崩溃,出现以下异常:
io.reactivex.exceptions.OnErrorNotImplementedException:text\u视图不能为null
但是如果我尝试在可观察范围之外运行该方法,那么一切都会正常工作
我知道使用findViewById()访问视图将正确检索视图,但这违背了使用kotlin android扩展的目的 旋转时,屏幕将重新设置,因此旧视图将消失 您必须在
onStop()
中取消订阅(通过subscribe()
调用返回)
也许你应该试试Android架构的
ViewModel
。我最近一直在用它,真的很喜欢它。这也会解决你的问题 旋转时,屏幕将重新设置,因此旧视图将消失
您必须在onStop()
中取消订阅(通过subscribe()
调用返回)
也许你应该试试Android架构的
ViewModel
。我最近一直在用它,真的很喜欢它。这也会解决你的问题 视图层次结构在onCreateView和onDestroyView之间有效。通常,您(un)注册观察者,即(un)在onStart和onStop中订阅观察者。让计时器在ViewModel中运行,并仅在实际需要时订阅UI,这在onStart中,在onStop中是dispose。这样就不会泄露旧的视图层次结构。我已经在使用ViewModel了。对updateUi()方法的调用实际上触发了一个更新以及一些ui组件(崩溃的部分)的更新。我对将计时器放在viewmodel中是什么意思感到有点困惑。感谢您的评论。视图层次结构在onCreateView和onDestroyView之间有效。通常,您(un)注册观察者,即(un)在onStart和onStop中订阅观察者。让计时器在ViewModel中运行,并仅在实际需要时订阅UI,这在onStart中,在onStop中是dispose。这样就不会泄露旧的视图层次结构。我已经在使用ViewModel了。对updateUi()方法的调用实际上触发了一个更新以及一些ui组件(崩溃的部分)的更新。我对将计时器放在viewmodel中是什么意思感到有点困惑。谢谢你的评论。我已经在使用ViewModel了。在updateUi()方法中,有一个更新ViewModel以及更新一些ui组件(崩溃的部分)的调用。可观察的时间间隔是在应用程序中具有类似自动刷新的功能。好的,那么看起来您仍然应该处理ViewModel中的行为,并在ViewModel的onCleared()中取消订阅我已经在使用ViewModel。在updateUi()方法中,有一个更新ViewModel以及更新一些ui组件(崩溃的部分)的调用。可观察的时间间隔是在应用程序中具有类似自动刷新的功能。好的,那么看起来您仍然应该处理ViewModel中的行为,并在ViewModel的onCleared()中取消订阅