当您具有异步加载的数据时,我只是对ViewModel的想法感到困惑。
这是ViewModel的示例
public class UsersViewModel extends ViewModel {
private List<User> userList;
public List<User> getUserList() {
if (userList == null) {
usersList = loadUsers();
}
return userList;
}
private List<User> loadUsers() {
// This is async task
}
}
活动:
public class UsersActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsersViewModel usersViewModel =
ViewModelProviders.of(this).get(UsersViewModel.class);
showUsers(usersViewModel.getUserList());
}
}
这将显示一个空列表(或者崩溃为空),因为asynctask尚未完成。我在网上看到的所有示例都是同步阻止调用。但是,如果它是一个异步调用,它将从服务器获取数据并更新UI,该怎么办?我们该如何处理?
答案 0 :(得分:2)
您可以使用实时数据来实现。 ViewModel将返回MutableLiveData,并在您的视图上订阅任何值更改。
您还可以使用数据绑定,然后视图中的数据将自动更改。
ABBC
然后在您的活动上
public class NameViewModel extends ViewModel {
// Create a LiveData with a String
private MutableLiveData<String> mCurrentName;
public MutableLiveData<String> getCurrentName() {
if (mCurrentName == null) {
mCurrentName = new MutableLiveData<String>();
}
return mCurrentName;
}
// Rest of the ViewModel...
}
https://developer.android.com/topic/libraries/architecture/livedata
答案 1 :(得分:1)
正如Felipe R.在他的回答中建议的那样,您可以使用LiveData实现它,但我会说您不应该就此停止。
将所有Android架构组件结合使用时,它们的真正功能就会发挥出来。
从这3个组件中,我认为ViewModel是唯一可以单独使用的组件。另外两个可以带来一些优势,但是当您使用所有这些优势时就会发挥全部功能。 您还将花费大量时间为实现编写测试。