ViewModel谁的数据基于异步任务

时间:2018-10-01 20:53:52

标签: android android-viewmodel

当您具有异步加载的数据时,我只是对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,该怎么办?我们该如何处理?

2 个答案:

答案 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架构组件结合使用时,它们的真正功能就会发挥出来。

  • ViewModel-当您要从后台线程或其他长期运行的进程更新UI时,将使您的工作变得更加轻松,因为它们以独立的方式链接到Activit / Fragment生命周期,因此不再需要NPE当您的AsyncTask发布作业结果时,将从窗口中删除的视图。
  • LiveData-将帮助您将数据从ViewModel传输到UI,而不必担心哪个线程返回了响应。 LiveData可以用RxJava或Rx替换为Kotlin,但我更喜欢将其用于UI更新
  • 数据绑定-可以在有信息时帮助您“自动更新” UI,还可以使您不时脱离某些NPE。

从这3个组件中,我认为ViewModel是唯一可以单独使用的组件。另外两个可以带来一些优势,但是当您使用所有这些优势时就会发挥全部功能。 您还将花费大量时间为实现编写测试。