在另一个活动中加载ViewModel实例

时间:2018-09-29 09:00:18

标签: java android android-activity viewmodel

启动应用程序时,我需要下载数据并填充所有viewModel,以避免在应用程序使用过程中出现速度下降的情况。 第一项活动是:

public class MainActivity extends AppCompatActivity {
private MainViewModel mainViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

   }
}

我正在考虑在活动中创建另一个活动的viewModel实例之上,并将其传递给意图。 我不确定不是在其一致的活动中创建viewModel实例是否正确?

1 个答案:

答案 0 :(得分:0)

  

ViewModel类旨在以生命周期感知的方式存储和管理与UI相关的数据。

如果您想在viewModel之间共享任何数据,最好的办法是创建一个singleton数据源,并将其提供给viewModels内部,例如SharedPreferencessqlite datase,等

如果确实需要使用viewModel作为数据源,则可以通过实现自定义singletone来创建它的ViewModelFactory实例,该实例已经在github issue中进行了讨论:

  

您可以使用factory来创建viewmodel,并且此因子将返回视图模型的单个对象。

class ViewModelFactory() : ViewModelProvider.Factory {

    override fun create(modelClass: Class): T {
        if (modelClass.isAssignableFrom(UserProfileViewModel::class.java)) {
            val key = "UserProfileViewModel"
            if(hashMapViewModel.containsKey(key)) {
                return getViewModel(key) as T
            } else {
                addViewModel(key, UserProfileViewModel())
            return getViewModel(key) as T
        }
    }
    throw IllegalArgumentException("Unknown ViewModel class")
    }

    companion object {
        val hashMapViewModel = HashMap<String, ViewModel>()

        fun addViewModel(key: String, viewModel: ViewModel) {
            hashMapViewModel.put(key, viewModel)
        }

        fun getViewModel(key: String): ViewModel? {
            return hashMapViewModel[key]
        }
    }
}
  

活动中:

viewModelFactory = Injection.provideViewModelFactory(this)

// Initialize Product View Model
userViewModel = ViewModelProviders.of(this,viewModelFactory).get(UserProfileViewModel::class.java)
  

这将仅提供UserProfileViewModel的单个对象,您可以在“活动”之间共享。