如何从后台服务更新 ViewModel 的 LiveData 并更新 UI

新手上路,请多包涵

最近我正在探索谷歌最近推出的 Android 架构。从 文档 中我发现了这个:

 public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<Users>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // do async operation to fetch users
    }
}

活动可以按如下方式访问此列表:

 public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}

我的问题是,我要这样做:

  1. loadUsers() 函数中,我异步获取数据,我将首先检查数据库(房间)中的数据

  2. 如果我没有在那里获取数据,我将调用 API 从 Web 服务器获取数据。

  3. 我会将获取的数据插入数据库(房间)并根据数据更新 UI。

推荐的方法是什么?

If I start a Service to call the API from the loadUsers() method, how can I update the MutableLiveData<List<User>> users variable from that Service ?

原文由 S Haque 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我假设您正在使用 android 架构组件。实际上,无论您在哪里调用 service, asynctask or handler 来更新数据都无关紧要。您可以使用 postValue(..) 方法从服务或异步任务中插入数据。您的课程将如下所示:

 private void loadUsers() {
    // do async operation to fetch users and use postValue() method
    users.postValue(listOfData)
}

由于 usersLiveDataRoom 数据库负责在任何插入位置提供用户数据。

Note: 在类似MVVM的架构中,repository主要负责检查和拉取本地数据和远程数据。

原文由 androidcodehunter 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以在后台线程中使用 MutableLiveData<T>.postValue(T value) 方法。

 private void loadUsers() {
    // do async operation to fetch users and use postValue() method
   users.postValue(listOfData)
}

原文由 minhazur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题