Я хочу попрактиковаться в 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);
}
Моя цель - запустить обновление для каждого расстояния Ресторана от пользователя, выполнив следующие действия:
- Итерация с использованием for-each l oop в каждом RestaurantEntity
- Обновление каждого
distance
атрибута - Замена существующих данных
На каком этапе шаблона 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);
}
});
- Что может быть лучше, рабочая архитектура или подход для этого?
- Есть ли более продвинутый базовый образец (похожий на этот) для практики?