【问题标题】:How to Use MVVM With asyncTask or any other thing?如何将 MVVM 与 asyncTask 或任何其他东西一起使用?
【发布时间】:2018-09-27 17:58:07
【问题描述】:

我想使用 AsyncTaskLoader,但它已被弃用,所以我知道我可以使用 ViewModel 和实时数据或可变数据来代替 AsyncTaskLoader,但我不知道如何将它们与异步任务一起使用。

【问题讨论】:

    标签: java android android-asynctask asynctaskloader


    【解决方案1】:

    首先,我建议使用 JobScheduler/WorkManager,因为 Google 声明 here

    但是,如果您仍然对使用 AsyncTask/AsyncTaskLoader 感兴趣,这样的事情可能会有所帮助。由于ViewModel 持有对LiveData 的引用并且ViewModel 更新View (Activity or Fragment),因此您可以进行后台网络调用(使用AsyncTaskLoader)并在调用onLoadFinished 时更新liveData。 LiveData 的这次更新应该会触发 observable 并最终触发 View (Activity/Fragment)

    注意:确保从 API 调用返回的数据(例如:<POJO.class>)的类型为 MutableLiveData/LiveData

    【讨论】:

      【解决方案2】:

      在 ViewModel 中使用 AsyncTask 违背了使用 ViewModel 的目的。

      ViewModel基本用例是:

      public class MyViewModel extends ViewModel {
          private MutableLiveData<List<User>> users;
          public LiveData<List<User>> getUsers() {
              if (users == null) {
                  users = new MutableLiveData<List<User>>();
                  loadUsers();
              }
              return users;
          }
      
          private void loadUsers() {
              // Do an asynchronous operation to fetch users.
          }
      }
      

      loadUsers 中,您应该在后台线程中完成这项工作。您可以在此处使用 AsyncTask,但没有任何意义,因为您不会从其 doInBackground()onPostExecute() 方法中受益。

      【讨论】:

        【解决方案3】:

        带有 ViewModel 的 LiveData 仍然是最新的,您可以将简单的 AsyncTask 与 Android 架构组件(LiveData 和 ViewModel)一起使用,以了解 AsyncTask 的生命周期。 Loader 不如这种执行后台任务的方法高效。由于您已经知道如何编写 AsyncTask,因此您只需要将它与 LiveData 和 ViewModel 一起包装:它就像魔术一样工作。有关将 AsyncTask 与 LiveData 和 ViewModel 一起使用的信息,您可以查看 https://medium.com/androiddevelopers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-22
          • 2012-06-13
          • 1970-01-01
          • 2021-11-13
          • 1970-01-01
          相关资源
          最近更新 更多