Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Rx Java时,Android视图在旋转后为空_Android_Kotlin_Rx Java2_Kotlin Android Extensions - Fatal编程技术网

使用Rx Java时,Android视图在旋转后为空

使用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 {

我正在使用Kotlin Android扩展访问片段中的所有视图,这些视图按预期工作,即使在屏幕旋转后也可以正常访问

当我尝试访问Rx Java可观察间隔内的视图时,问题开始了,如下所示:

 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()中取消订阅