代码之家  ›  专栏  ›  技术社区  ›  Juan Manuel Amoros

存储库方法在异步改装调用中设置LiveData值

  •  5
  • Juan Manuel Amoros  · 技术社区  · 6 年前

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

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   stkent    6 年前

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

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

        2
  •  2
  •   Suleyman    6 年前

    好的,您将在ViewModel类中创建一个方法,该方法将从存储库中返回上面提到的方法,类似 LiveData<User>getUser() 。并且因为此函数返回的对象被包装在 LiveData 您将能够观察活动/片段中的变化:

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

    编辑:

    显然,@stkent的回答要精确得多,并且给出了代码工作的明确原因。