Как обновить каждый объект из списка LiveData? - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу попрактиковаться в MVVM, поэтому я разработал простое приложение Android, используя Room, DAO с LiveData, ViewModels.

Существует одна таблица "Restaurants", которая содержит RestaurantEntities, которые отображаются в виде RecyclerView. Вот RestaurantListViewModel

public class RestaurantListViewModel extends AndroidViewModel {
    private final LiveData<List<RestaurantEntity>> mRestaurants;

    public RestaurantListViewModel(@NonNull Application application, @NonNull SavedStateHandle savedStateHandle) {
        super(application);
        mRepository = ((BasicApp) application).getRepository();
        mRestaurants = mRepository.getRestaurants();
    }

    /**
     * Expose the LiveData Restaurants query so the UI can observe it.
     */
    public LiveData<List<RestaurantEntity>> getRestaurants() {
        return mRestaurants;
    }

    public void updateRestaurants(List<RestaurantEntity> restaurants) {
        mRepository.updateRestaurants(restaurants);
    }

Моя цель - запустить обновление для каждого расстояния Ресторана от пользователя, выполнив следующие действия:

  1. Итерация с использованием for-each l oop в каждом RestaurantEntity
  2. Обновление каждого distance атрибута
  3. Замена существующих данных

На каком этапе шаблона MVVM мне следует это сделать?

Если я запускаю обновление в MainActivity:

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRestaurantListViewModel.getRestaurants().observe(this, restaurantEntities -> {
            List<Restaurant> updatedEntities = updateRestaurantsDistances(restaurantEntities, myLocation);  // some computation in a background thread
            mRestaurantListViewModel.updateRestaurants(updatedEntities);                                    // calls the repository and the DAO
        });
    }
});

Наблюдатель запускается самим наблюдателем при событии обновления, вызывая бесконечное l oop. Я не могу найти способ, который не выглядит как «взлом» для решения этой проблемы, как, например, следующий, который вылетает в NullPointerException, если asyn c currentEntities = restaurantEntities не был выполнен до запуска onclick:

List<Restaurant> currentEntities = null;
mRestaurantListViewModel.getRestaurants().observe(this, restaurantEntities -> currentEntities = restaurantEntities);

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        List<Restaurant> updatedEntities = updateRestaurantsDistances(currentEntities , myLocation);
        mRestaurantListViewModel.updateRestaurants(updatedEntities);
    }
});
  1. Что может быть лучше, рабочая архитектура или подход для этого?
  2. Есть ли более продвинутый базовый образец (похожий на этот) для практики?
...