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

标签 android viewmodel background-service android-room android-architecture-components

最近我正在探索谷歌最近推出的 Android 架构。来自 Documentation我发现了这个:

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
    }
}

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

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。

推荐的方法是什么?

如果我开始 ServiceloadUsers() 调用 API方法,如何更新 MutableLiveData<List<User>> users变量 Service ?

最佳答案

我假设您使用的是 android architecture components .实际上,无论您在哪里调用 service、asynctask 或 handler 来更新数据都无关紧要。您可以使用 postValue(..) 方法从服务或异步任务中插入数据。你的类(class)应该是这样的:

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

由于 usersLiveData,所以 Room 数据库负责在任何插入的地方提供用户数据。

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

关于android - 如何从后台服务更新 ViewModel 的 LiveData 并更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204978/

相关文章:

java - 选项卡不填充 tablayout

android - 如何在 Android 11 上启动ActivityForResult?

Android - 通过 viewModels() 在 ViewModel 上使用可注入(inject)构造函数

java - Android - 从 AsyncTask doInBackground 函数返回整数值

android - Android上如何计算网卡何时打开连接

WPF MVVM OnPropertyChanged 两个 ViewModel 通信

java - MVVM绑定(bind),保存前获取以前的表单值

android - 有没有人知道如何在 android 中使用 L2TP/IPSec 服务器协议(protocol)以编程方式建立 VPN 连接?

java - 服务已经在运行,但它不应该在使用后台服务代码的位置

android - 我想在 android 应用程序中制作后台服务,即使应用程序关闭也应该继续运行