如何通过asyncTask或任何其他东西使用MVVM?

时间:2018-09-27 17:58:08

标签: java android android-asynctask asynctaskloader

我想使用AsyncTaskLoader,但它已被弃用,因此得知我可以使用ViewModel和实时数据或可变数据来代替AsyncTaskLoader,但是我不知道如何在异步任务中使用它们。

3 个答案:

答案 0 :(得分:2)

将AsyncTask与ViewModel结合使用会破坏使用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()方法中受益。

答案 1 :(得分:1)

首先,我建议按照Google声明here使用JobScheduler / WorkManager。

但是,如果您仍然对使用AsyncTask/AsyncTaskLoader感兴趣,则可能会有所帮助。由于ViewModel拥有对LiveData的引用,并且ViewModel更新了View (Activity or Fragment),因此您可以进行后台网络调用(使用AsyncTaskLoader)并在{{1 }} 叫做。 LiveData的此更新应触发可观察的并最终触发View(onLoadFinished

注意:确保从API调用(例如:Activity/Fragment)获取的数据的类型为<POJO.class> / MutableLiveData

答案 2 :(得分:1)

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