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

3

我希望使用AsyncTaskLoader,但它已被弃用,因此得知可以使用ViewModel和LiveData或MutableData来替代AsyncTaskLoader,但我不知道如何将它们与异步任务配合使用。

3个回答

3

首先,我建议使用JobScheduler/WorkManager,正如Google在这里所述。

但是,如果您仍然有兴趣使用AsyncTask/AsyncTaskLoader,可以尝试类似以下的方法。由于ViewModel持有对LiveData的引用,而ViewModel更新视图(Activity或Fragment),因此可以使用AsyncTaskLoader进行后台网络调用,并在onLoadFinished被调用时更新liveData。 LiveData的更新应该触发可观察对象并最终更新视图(Activity/Fragment)

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


3
使用AsyncTask与ViewModel相结合,将会削弱使用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() 方法中受益。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接