#android #android-livedata #android-architecture-components #android-viewmodel #android-mvvm
#Android #android-живые данные #android-архитектура-компоненты #android-viewmodel #android-mvvm #android-livedata
Вопрос:
У меня есть класс, который обрабатывает все сетевые операции с использованием модернизации, как показано ниже:
public class Networking{
public static void getCustomers(final PreviewCustomersViewModel previewCustomersViewModel) {
final Call<List<Customer>> getCustomersCall = service.getCustomers();
getCustomersCall.enqueue(new Callback<List<Customer>>() {
@Override
public void onResponse(@NonNull Call<List<Customer>> call, @NonNull Response<List<Customer>> response) {
if (response.isSuccessful()) {
previewCustomersViewModel.selectedDistCustomers = response.body();
previewCustomersViewModel.isCustomerListRetrieved.setValue(true);
//Send Broadcast Msg
} else {
previewCustomersViewModel.isCustomerListRetrieved.setValue(false);
//Send Broadcast Msg
}
}
@Override
public void onFailure(@NonNull Call<List<Customer>> call, @NonNull Throwable t) {
previewCustomersViewModel.isCustomerListRetrieved.setValue(false);
//Send Broadcast Msg
}
});
}
}
Как вы можете видеть, я передаю ссылку на объект ViewModel методу, который выполняет сетевой вызов, и после получения ответа я сообщаю об этом объекту Livedata в этой ViewModel. (Или с помощью широковещательного сообщения)
Но я думаю, что это может быть источником утечек памяти для объекта ViewModel, который я передаю, если пользователь переходит от одного действия к другому.
Использование широковещательного сообщения не потребовало бы от меня передачи объекта ViewModel, но хороший ли это подход?
Есть ли лучший способ добиться этого? Может быть, используя RxJava? Или я должен просто сохранить модифицированный код внутри ViewModel? Я хочу реализовать самое чистое решение.
Комментарии:
1. Будет активирован метод onCleared в viewmodel переданного вами действия.. В случае onDestroy, поскольку выполняется Cleared , соответствующая область предотвратит утечку памяти.
2. @kzncrda Но тогда попытка получить доступ к свойству viewmodel в обратном вызове модернизации приведет к ошибке, верно?
3. Я не рекомендую использовать модифицированные процессы в ViewModel.
4. @kzncrda Итак, хорош ли мой подход?
5. К ViewModel подключен статический метод. Мое предложение. Начиная с расширения прав и возможностей из единого центра. Управление вашими операциями вызова в информационном пуле.