在另一个 activity 中加载 ViewModel 实例
Load ViewModel instance in another activity
当应用程序启动时,我需要下载数据并填充所有 viewModel 以避免在应用程序使用过程中速度变慢。
首先activity是:
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);
}
}
我正在考虑在另一个 activity 的 viewModel 实例上方的 activity 中创建并通过意图传递它。
我不确定以不一致的方式创建 viewModel 实例是否正确 activity.
The ViewModel
class is designed to store and manage UI-related data in a lifecycle conscious way.
如果您想在 viewModel 之间共享任何数据,最好的办法是创建一个 singleton
数据源并在 viewModel 内部提供它,例如 SharedPreferences
、sqlite
数据集等
如果您确实需要使用 viewModel 作为数据源,您可以通过实现自定义 ViewModelFactory
创建它的 singletone
实例,这已在本 github 中讨论issue:
you can use factory to make viewmodel and this factor will return single object of view model.. As:
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]
}
}
}
In Activity:
viewModelFactory = Injection.provideViewModelFactory(this)
// Initialize Product View Model
userViewModel = ViewModelProviders.of(this,viewModelFactory).get(UserProfileViewModel::class.java)
This will provide only single object of UserProfileViewModel which you can share between Activities.
当应用程序启动时,我需要下载数据并填充所有 viewModel 以避免在应用程序使用过程中速度变慢。 首先activity是:
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);
}
}
我正在考虑在另一个 activity 的 viewModel 实例上方的 activity 中创建并通过意图传递它。 我不确定以不一致的方式创建 viewModel 实例是否正确 activity.
The
ViewModel
class is designed to store and manage UI-related data in a lifecycle conscious way.
如果您想在 viewModel 之间共享任何数据,最好的办法是创建一个 singleton
数据源并在 viewModel 内部提供它,例如 SharedPreferences
、sqlite
数据集等
如果您确实需要使用 viewModel 作为数据源,您可以通过实现自定义 ViewModelFactory
创建它的 singletone
实例,这已在本 github 中讨论issue:
you can use factory to make viewmodel and this factor will return single object of view model.. As:
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]
}
}
}
In Activity:
viewModelFactory = Injection.provideViewModelFactory(this)
// Initialize Product View Model
userViewModel = ViewModelProviders.of(this,viewModelFactory).get(UserProfileViewModel::class.java)
This will provide only single object of UserProfileViewModel which you can share between Activities.