Repository 方法在 Asynchronous Retrofit 调用中设置 LiveData 值
Repository method sets LiveData value inside Asynchronous Retrofit call
在阅读 Android Architecture Components 的官方指南时,在使用 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<>();
然后在改型异步调用中,我们设置该变量的值。
由于这是一个异步调用,该方法不会 return 初始化数据但从未设置值吗?
您是正确的,LiveData
实例可能会在异步网络请求完成之前从您显示的方法返回。
如果将网络请求排入队列不足以阻止它符合垃圾收集条件,这将是一个问题。由于情况并非如此,网络请求将在您退出您的方法后继续执行。请求完成后,该值将是 "fed into" 您返回的 LiveData
实例(这是对 setValue
的调用所做的),然后将通知该实例的观察者。
AFAIK,您将在 ViewModel class 中创建一个方法,它将 return 您上面从存储库中提到的方法,例如 LiveData<User>getUser()
。因为这个函数的 returned 对象被包装在 LiveData
中,你将能够观察到 Activity/Fragment:
中的变化
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
编辑:
显然@stkent 的回答更加精确,并给出了代码为何有效的明确原因。
在阅读 Android Architecture Components 的官方指南时,在使用 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<>();
然后在改型异步调用中,我们设置该变量的值。
由于这是一个异步调用,该方法不会 return 初始化数据但从未设置值吗?
您是正确的,LiveData
实例可能会在异步网络请求完成之前从您显示的方法返回。
如果将网络请求排入队列不足以阻止它符合垃圾收集条件,这将是一个问题。由于情况并非如此,网络请求将在您退出您的方法后继续执行。请求完成后,该值将是 "fed into" 您返回的 LiveData
实例(这是对 setValue
的调用所做的),然后将通知该实例的观察者。
AFAIK,您将在 ViewModel class 中创建一个方法,它将 return 您上面从存储库中提到的方法,例如 LiveData<User>getUser()
。因为这个函数的 returned 对象被包装在 LiveData
中,你将能够观察到 Activity/Fragment:
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
编辑:
显然@stkent 的回答更加精确,并给出了代码为何有效的明确原因。