【问题标题】:Disposing Maybe in RxAndroid在 RxAndroid 中处理 Maybe
【发布时间】:2019-05-29 06:44:43
【问题描述】:

我是反应式世界的新手,所以如果我说的有误,请多多包涵(请纠正我!)。

所以我在谷歌和这里搜索类似的东西,但我想我没有看到任何关于我所做的事情的途径。我正在使用 Rx2Firebase 库使用 RxFirebaseDatabase.observeSingleValueEvent 方法从我的数据库中获取一些数据,但我无法理解如何处理我制作的 Observable。所以这个方法返回一个 Maybe ,我想在执行我的代码后处理掉这个 Maybe ,但我不确定如何(请阅读下文了解原因)。

我当前的代码如下所示:

private fun getUserStatus(callback: () -> Unit) {

RxFirebaseDatabase
    .observeSingleValueEvent(myQuery,(entry::class.java))
    .subscribe ({ item
     myEntry = item
     callback()
   },{ e
     Log.e("Error", e.message)
   })
}

根据我的阅读,可观察对象被分配给Disposable 变量,然后我认为该变量会被释放?像var disposable: Disposable = <Insert my code above for calling Firebase> 这样的东西,你会在onDestroy 里面这样做(从我读到的)。我的问题是,如果我的代码没有在 Activity 或 Fragment 中执行,我该怎么做?我不能只在我的代码末尾 .subscribe 之后添加一个 dispose(),因为这只会在调用完成之前结束。

【问题讨论】:

    标签: kotlin rx-android


    【解决方案1】:

    您无需在代码执行后处理 Maybe。每当您需要取消基础操作时,您应该处置任何可观察的。由于您使用的是 Android,因此该操作是从某个生命周期感知组件中触发的。这可能是ActivityFragmentService。如果您从BroadcastReceiver 触发呼叫,则应该启动一个服务来执行此操作。

    对于这些组件中的任何一个,您都有一个方法 onDestroy,您可以在其中处理 observable。您唯一需要确保的是将Disposable 传播到此级别:

    private fun getUserStatus(callback: () -> Unit): Disposable =
        RxFirebaseDatabase
          .observeSingleValueEvent(myQuery,(entry::class.java))
          .subscribe ({ item ->
              myEntry = item
              callback()
          },{ e ->
              Log.e("Error", e.message)
          })
    

    【讨论】:

    • 谢谢!这就是我需要的。它按预期工作。如果那里有任何超级菜鸟(像我一样),我只是通过记录 isDisposed 属性来检查 onDestroyView() 和 onDestroy() 以检查它是否已被处置。
    • 更正我上次所说的...如果您使用标签,请不要在 onViewDestroy 上执行此操作。如果您的其他选项卡也在观察同样的事情,那最终会导致崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多