Правильный способ получения экземпляра ViewModel за пределами действия или фрагмента - PullRequest
0 голосов
/ 24 июня 2018

Я создаю приложение для определения местоположения, в котором я отображаю фоновые местоположения из базы данных Room в MainActivity. Я могу получить ViewModel, позвонив

locationViewModel = ViewModelProviders.of(this).get(LocationViewModel.class);
locationViewModel.getLocations().observe(this, this);

Периодические фоновые местоположения должны сохраняться в базе данных комнат, когда я получаю обновления местоположений через BroadCastReceiver. Их следует сохранить, позвонив по номеру locationViewModel.getLocations().setValue()

public class LocationUpdatesBroadcastReceiver extends BroadcastReceiver {

    static final String ACTION_PROCESS_UPDATES =
            "com.google.android.gms.location.sample.backgroundlocationupdates.action" +
                    ".PROCESS_UPDATES";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_PROCESS_UPDATES.equals(action)) {
                LocationResult result = LocationResult.extractResult(intent);
                if (result != null) {
                    List<Location> locations = result.getLocations();
                    List<SavedLocation> locationsToSave = covertToSavedLocations(locations)
                    //Need an instance of LocationViewModel to call locationViewModel.getLocations().setValue(locationsToSave)
                }
            }
        }
    }
}

Вопрос в том, как мне получить экземпляр LocationViewModel в неактивном классе, таком как этот BroadcastReceiver? Правильно ли вызывать locationViewModel = ViewModelProviders.of(context).get(LocationViewModel.class), где контекст - это контекст, который я получаю от onReceive (Context context, Intent intent) BroadcastReceiver?

После получения ViewModel мне нужно использовать LiveData.observeForever и LiveData.removeObserver , поскольку BroadcastReceiver не является LifecycleOwner?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вопрос в том, как мне получить экземпляр LocationViewModel в неактивном классе, таком как этот BroadcastReceiver?

Вы не должны этого делать.Это плохая практика проектирования.

Правильно ли вызывать locationViewModel = ViewModelProviders.of (context) .get (LocationViewModel.class), где context - это контекст, который я получаю из onReceive (Context context, Intent intent) из BroadcastReceiver?

Нет.Это не поможет

Вы можете достичь желаемого результата следующим образом:

Отделите операцию Room DB от ViewModel в отдельном синглтон-классе.Используйте его в ViewModel и любом другом необходимом месте.При получении широковещательной рассылки записывайте данные в БД через этот одноэлементный класс, а не ViewModel.

Если вы наблюдаете за LiveData в вашем Фрагменте, он также обновит ваши представления.

0 голосов
/ 24 июня 2018

Запрещается передавать экземпляр ViewModel.
В вашем случае вместо этого передайте locationViewModel.getLocations().
Я не слишком знаком с компонентами архитектуры, но в стандартной привязке данных Android можно передатьObservable* экземпляров для установки и получения их значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...