首页 > 解决方案 > 在多个片段中使用相同的观察者并仅在可见片段中接收响应,而不是在后台堆栈中的那个

问题描述

我正在使用 RxJava 来访问我的 android 应用程序中的 API。这里的问题是,如果在两个片段中使用相同的观察者,一个片段在后台堆栈中,另一个在顶部,那么两个片段都会收到响应,但这不是我想要的。这里的确切情况是:

在一个按钮上单击一个 API 请求正在使用:

userModel.hitAPi("12", myList)

并观察使用:

 val obs = userModel.responseAPI.observe(this,
            Observer {
                if (it != null) {
                    if(it.httpCode == 200)
                        Log.e(TAG, "Response: " + it.toString())
                    else{
                        Log.e(TAG, "Response: " + it.toString())
                    }
                }
            })

这是 ViewModel 类:

 class UserViewModel: ViewModel() {

    private val cd = CompositeDisposable()
    val status: MutableLiveData<Boolean>? = MutableLiveData<Boolean>()

    val responseAPI = MutableLiveData<ResponseAdd>()
    fun hitAPi(userID: String, items: ArrayList<Item>){
        val myModel = ModelAdd("",items,"in",userID,"" )
        cd.add(
            RetrofitHelper.apiInstance.addToCart(myModel)
                .myApiSubscriber(status)
                .subscribe({
                    responseAPI.postValue(it)
                },{
                    it.printStackTrace()
                })
        )
    }

       private fun <T> Single<T>.myApiSubscriber(status: MutableLiveData<Boolean>?): Single<T> {
        return this.doOnSubscribe {
            status?.postValue(true)
            Utils.debugger("PROGRESS ", " doOnSubscribe")
        }.doFinally {
            status?.postValue(false)
            Utils.debugger("PROGRESS ", " doFinally")
        }.subscribeOn(Schedulers.io())
    }

    override fun onCleared() {
        cd.dispose()
        super.onCleared()
    }
}

现在在响应之前,如果用户切换到另一个具有相同观察者的片段,那么响应会在该片段中收到,那么我如何在迁移到另一个片段之前将其处理掉?

标签: androidrx-java2rx-android

解决方案


这个问题目前缺乏很多细节,感觉好像我们在用伪代码说话。什么是“同一个观察者”?这些是在哪里Observable订阅的?两者是否Fragment都想接收 API 调用的结果,但只接收当前屏幕上的结果?然后,您将希望将 API 调用生命周期与两者分开,Fragment并让Fragments 观察随着 API 调用结果更新的某些内容(例如数据库)。

当您.subscribe()返回Observable一个Disposable对象时,这是您可以dispose()Fragmentis onPause()(或其他适当的生命周期)时调用的引用。


推荐阅读