【发布时间】:2020-01-29 22:28:00
【问题描述】:
我正在使用 MVVM 和 rxJava 和改造来发送我的请求。 我有一个底部导航视图,其中有 5 个片段,在其中一个片段中,我必须发送一个请求,然后发送响应,我必须向我的服务器发送另一个请求。 这是我的 ViewModel 类:
class MyViewModel: ViewModel() {
val compositeDisposable = CompositeDisposable()
val myFirstReqLiveData = MutableLiveData<myFirstReqModel>()
val mySecondReqLiveData = MutableLiveData<mySecondReqModel>()
fun getFirstReq(token:String){
val firstReqDisposable = RetrofitClientInstance.getRetrofitInterface()
.getFirstReq(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).singleElement()
.subscribe({
it-> myFirstReqLiveData.value = it
},{
errorFirstReqLiveData.value = it
},{
})
compositeDisposable.add(firstReqDisposable)
}
fun getSecondReq(token:String){
val secondReqDisposable = RetrofitClientInstance.getRetrofitInterface()
.getSecondReq(token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).singleElement()
.subscribe({
it-> mySecondReqLiveData.value = it
},{
errorSecondReqLiveData.value = it
},{
})
compositeDisposable.add(SecondReqDisposable)
}
override fun onCleared() {
super.onCleared()
compositeDisposable.clear()
}
}
在我的片段中,我是这样实现的:
class FirstTabFragment : Fragment() {
private lateinit var myViewModel: MyViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
myViewModel = ViewModelProviders.of(activity!!).get(MyViewModel::class.java)
getFirstReq(myViewModel, token!!)
observeFirstReq(myViewModel)
observeFirstReqError(myViewModel)
observeSecondReq(myViewModel)
observeSecondReqError(myViewModel)
}
fun getFirstReq(viewModel: MyViewModel, token: String) {
viewModel.getFirstReq(token)
}
fun observeFirstReq(viewModel: MyViewModel) {
viewModel.getFirstReqLiveData().observe(this, Observer { myFirstReqModel ->
getSecondReq(myViewModel)
}
}
fun getSecondReq(viewModel: MyViewModel, token: String) {
viewModel.getSecondReq(token)
}
fun observeSecondReq(viewModel: MyViewModel) {
viewModel.getSecondReqLiveData().observe(this, Observer { mySecondReqModel ->
//do some work with my data
}
}
我的问题是当我切换标签时,我的第二个请求被调用了多次。
我想我每次重新打开我的片段时都会分配一个新的订阅,所以它调用了几次。
我该如何解决这个问题?!
【问题讨论】:
-
getFirstReqLiveData 在您切换选项卡时收到通知。由于它正在为第二个请求进行 API 调用。您必须将可变的实时数据包装到 Event
中,并且在片段中,您必须作为 EventObserver 进行观察 -
@KishanMaurya 你能解释更多吗?我是新手,我不知道如何实现你所说的
-
如果发布的代码对你有用,请告诉我.. 否则分享代码,我会调试并告诉你原因
标签: android mvvm retrofit rx-java android-mvvm