【问题标题】:Repository method sets LiveData value inside Asynchronous Retrofit call存储库方法在异步改造调用中设置 LiveData 值
【发布时间】:2018-10-06 13:49:13
【问题描述】:

在阅读 Android Architecture Components 的官方指南时,在使用改造请求解释存储库层的部分中,有一段代码我似乎无法完全理解:

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<>();

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

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

【问题讨论】:

  • 只是好奇你做了什么来最终为相同的东西编写单元测试

标签: android retrofit2 android-architecture-components user-guide


【解决方案1】:

afaik,您将在ViewModel类中创建一种方法,该方法将从存储库中返回上面提到的方法,类似于LiveData&lt;User&gt;getUser()。而且由于从此函数返回的对象被包装在LiveData @,您将能够遵守活动/片段的更改:

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

编辑:

显然,@stkent的答案更精确,并给出了代码工作的明确原因。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2016-03-24
      • 2014-05-27
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多