viewmodel观察在片段和活动中连续触发同一事件多次(3-4)。这是viewmodel代码:
userModel.getResponseSuperRegion(countryID)
userModel.responseSuperRegion.observe(this,
Observer {
if(it!=null) {
Log.e(TAG,"Observer ran!!!!")
Utils.debugger("FRAG ", "$it")
requestResults(countryID, date, spec, it!!.get(0).nameValue, businessUnit)
}else{
Toast.makeText(applicationContext, "Data Not Available!", Toast.LENGTH_LONG).show()
dismissProgress()
}
})
我用于片段的相同类型的代码,在那里我也收到相同的问题。我已经尝试过使用viewLifecycleOwner进行尝试,但是在出现碎片的情况下也不起作用,并且viewLifecycleOwner不存在活动,因此请向我建议一些摆脱此问题的方法。我已经阅读了大多数类似的SO线程,但是它们都没有起作用。
Update:已被尝试userModel.responseSuperRegion.removeObservers(this)
您在ViewPager中说过片段吗?
您在oncreate()
调用视图模型吗?喜欢
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//init ViewModel
UserViewModel userModel = ViewModelProviders.of(this)
.get(UserViewModel.class);
userModel.getResponseSuperRegion(countryID);
}
编辑:如果您使用Kotlin将视图模型更改为init函数更改viewModel
class UserModel(val countryID:String):ViewModel(){
init{
getResponseSuperRegion(countryID)
}
fun getResponseSuperRegion(countryID){
...
}
}
然后在活动或基础活动中将其删除
userModel.getResponseSuperRegion(countryID)
然后更改
val viewModel = ViewModelProviders.of
(this,CustomViewModelFactory("countryID")).get(UserViewmodel::class.java)
将参数countryID从活动传递到视图模型
这就像魅力一样,一旦触发产生,基本上就删除订阅者。
userModel.getResponseGrowthSpinner(businessUnitID, isGroup, firstReportTypeId)
userModel.responseGrowthSpinner.observe(this,
Observer {
Utils.debugger("FRAG ", "$it")
purchase_options_spinner.adapter = GrowthSpinnerAdapter(it)
userModel.responseGrowthSpinner.removeObservers(this) //add this line
})