启动应用程序时,我需要下载数据并填充所有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实例是否正确?
答案 0 :(得分:0)
ViewModel
类旨在以生命周期感知的方式存储和管理与UI相关的数据。
如果您想在viewModel之间共享任何数据,最好的办法是创建一个singleton
数据源,并将其提供给viewModels内部,例如SharedPreferences
,sqlite
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的单个对象,您可以在“活动”之间共享。