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