Метод репозитория устанавливает значение LiveData в вызове Asynchronous Retrofit - PullRequest
0 голосов
/ 26 апреля 2018

При ознакомлении с официальным руководством по Android Компоненты архитектуры в разделе, объясняющем уровень хранилища с помощью запроса Retrofit, есть фрагмент кода, который я не могу полностью понять:

public class UserRepository {
    private Webservice webservice;
    // ...
    public LiveData<User> getUser(int userId) {
        // This is not an optimal implementation, we'll fix it below
        final MutableLiveData<User> data = new MutableLiveData<>();
        webservice.getUser(userId).enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                // error case is left out for brevity
                data.setValue(response.body());
            }
        });
        return data;
    }
}

На этом этапе мы инициализируем наш LiveData объект:

final MutableLiveData<User> data = new MutableLiveData<>();

Затем в асинхронном вызове для модификации мы устанавливаем значение для этой переменной.

Как этоасинхронный вызов, разве этот метод не вернет инициализированные данные, но никогда не с установленным значением?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

AFAIK, вы создадите метод в классе ViewModel, который будет возвращать упомянутый выше метод из хранилища, что-то вроде LiveData<User>getUser().И поскольку объект, возвращаемый из этой функции, обернут в LiveData, вы сможете наблюдать изменения в вашей активности / фрагменте:

 MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    model.getUsers().observe(this, users -> {
        // update UI
    });

РЕДАКТИРОВАТЬ:

Очевидно, что ответ @stkent гораздо точнее и дает четкую причину, почему код работает.

0 голосов
/ 26 апреля 2018

Вы правы, что экземпляр LiveData, скорее всего, будет возвращен из метода, который вы показываете, до завершения асинхронного сетевого запроса.

Это может быть проблемой, если постановка в очередь сетевого запроса недостаточна для его предотвращенияот права на сбор мусора.Поскольку это не так, сетевой запрос продолжит выполняться после выхода из вашего метода.Как только запрос завершится, значение будет «передано» в экземпляр LiveData, который вы вернули (это то, что делает вызов setValue), и наблюдатели этого экземпляра будут уведомлены.

...