Загрузить экземпляр ViewModel в другой деятельности - PullRequest
0 голосов
/ 29 сентября 2018

При запуске приложения мне нужно загрузить данные и заполнить все viewModels, чтобы избежать замедления во время использования приложения.Первое действие:

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 голосов
/ 29 сентября 2018

Класс ViewModel предназначен для хранения и управления данными, относящимися к пользовательскому интерфейсу, с учетом жизненного цикла.

Если вы хотите поделиться какими-либо данными между вашими viewModels, лучше всего было бы создать источник данных singleton и предоставить его внутри viewModels, например, SharedPreferences, sqlite datase,и т. д.

Если вам действительно нужно использовать viewModel в качестве источника данных, вы можете создать его экземпляр singletone, реализовав пользовательский ViewModelFactory, который уже обсуждался в этой проблеме github :

вы можете использовать фабрику для создания модели представления, и этот коэффициент будет возвращать отдельный объект модели представления. Как:

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]
        }
    }
}

В Activity:

viewModelFactory = Injection.provideViewModelFactory(this)

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

Это обеспечит только один объект UserProfileViewModel, который вы можете разделить между действиями.

...