Android ViewModel recreated on screen rotation

前端 未结 4 1122
滥情空心
滥情空心 2021-02-14 11:01

I found a case when architecture components ViewModel isn\'t retained - in short it goes as follows:

  1. Activity is started and ViewModel in
4条回答
  •  你的背包
    2021-02-14 11:10

    Yes @tomwyr, this was a bug from an android framework. Bug details

    The fix is available in 28.0.0-alpha3 and AndroidX 1.0.0-alpha3

    But if you don't want to update to above versions now itself, Then you can solve like this (I know this is a bad solution but I didn't see any other good way)

    In your activity override onDestroy method and save all the required fields to local variables before calling super.onDestroy. Now call super.onDestroy then Initialize your ViewModel again and assign the required fields back to your new instance of ViewModel

    about isFinishing

    Below code is in Kotlin:

    override fun onDestroy() {
         val oldViewModel = obtainViewModel()
    
         if (!isFinishing) { //isFinishing will be false in case of orientation change
    
              val requiredFieldValue = oldViewModel.getRequiredFieldValue()
    
              super.onDestroy
    
             val newViewModel = obtainViewModel()
    
             if (newViewModel != oldViewModel) { //View Model has been destroyed
                  newViewModel.setRequiredFieldValue(requiredFieldValue)
              }
          } else {
             super.onDestroy
          }
     }
    
    private fun obtainViewModel(): SampleViewModel {
          return ViewModelProviders.of(this).get(SampleViewModel::class.java)
    }
    

提交回复
热议问题