在另一个 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 内部提供它,例如 SharedPreferencessqlite数据集等

如果您确实需要使用 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.