android - 在多个片段中使用相同的观察者并仅在可见片段中接收响应,而不是在后台堆栈中的那个
问题描述
我正在使用 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()
}
}
现在在响应之前,如果用户切换到另一个具有相同观察者的片段,那么响应会在该片段中收到,那么我如何在迁移到另一个片段之前将其处理掉?
解决方案
这个问题目前缺乏很多细节,感觉好像我们在用伪代码说话。什么是“同一个观察者”?这些是在哪里Observable
订阅的?两者是否Fragment
都想接收 API 调用的结果,但只接收当前屏幕上的结果?然后,您将希望将 API 调用生命周期与两者分开,Fragment
并让Fragment
s 观察随着 API 调用结果更新的某些内容(例如数据库)。
当您.subscribe()
返回Observable
一个Disposable
对象时,这是您可以dispose()
在Fragment
is onPause()
(或其他适当的生命周期)时调用的引用。
推荐阅读
- c# - 如何在 api 项目的 Startup 类中使用集成测试项目的设置?
- python - TensorFlow 中的自定义数据集
- python - 滚动 Python Selenium 中的特定 DIV 元素
- jquery - 是否可以将调整大小绑定到正文元素?
- nmap - 如何在 Nmap 中提供用于暴力破解的 URL 列表?
- batch-file - 如何运行不使用 cmd.exe 的批处理(如 Cmder.exe?)
- php - Laravel maatwebsite/excel composer在mac中安装错误
- sql - Oracle PL/SQL 查询,通过循环添加新列
- html - 使宽度为
- javascript - EventSource 重新连接时,一些服务器发送的事件丢失