在浏览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<>();
然后在改进的异步调用中,我们设置该变量的值。
由于这是一个异步调用,该方法是否只返回已初始化的数据但从未设置值?
答案 0 :(得分:2)
您是正确的,可能会在异步网络请求完成之前从您显示的方法返回LiveData
实例。
如果排队网络请求不足以阻止其符合垃圾回收条件,那么这将是一个问题。由于情况并非如此,因此退出方法后网络请求将继续执行。请求完成后,该值将被输入&#34;您返回的LiveData
实例(这是对setValue
的调用),然后将通知该实例的观察者。
答案 1 :(得分:2)
AFAIK,您将在ViewModel类中创建一个方法,该方法将从存储库返回您上面提到的方法,例如LiveData<User>getUser()
。并且因为从此函数返回的Object包含在LiveData
中,您将能够观察到Activity / Fragment中的更改:
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
修改强>
显然@stkent的答案更准确,并给出了代码有效的明确原因。