ViewAPI观察被触发两次以上,而API仅被击中一次

问题描述 投票:1回答:3

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)

android rx-java rx-android android-viewmodel
3个回答
0
投票

您在ViewPager中说过片段吗?


0
投票

您在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从活动传递到视图模型


0
投票

这就像魅力一样,一旦触发产生,基本上就删除订阅者。

 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
            })
© www.soinside.com 2019 - 2024. All rights reserved.