繁体   English   中英

Repository方法在Asynchronous Retrofit调用中设置LiveData值

[英]Repository method sets LiveData value inside Asynchronous Retrofit call

在浏览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<>();

然后在改进的异步调用中,我们设置该变量的值。

由于这是一个异步调用,该方法不会只返回已初始化的数据,但从不使用值集吗?

您是正确的,可能会在异步网络请求完成之前从您显示的方法返回LiveData实例。

如果排队网络请求不足以阻止其符合垃圾收集条件,则会出现问题。 由于情况并非如此,因此退出方法后网络请求将继续执行。 请求完成后,该值将“输入”您返回的LiveData实例(这是对setValue的调用),然后将通知该实例的观察者。

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的答案更精确,并给出了代码有效的明确原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM