如何解决WorkManager使用Livedata观察状态
我正在使用OneTimeWorkRequest进行一些工作,并使用getWorkInfosByTagLiveData()观察其状态,在应用程序被杀死和/或重新创建了活动并在onCreate()中再次创建了观察者之后,我收到了最近完成的工作信息,并且吐司消息已触发,我认为WorkManager会以某种方式缓存最近完成的workInfos。我只想在工作当前正在进行状态更改时显示吐司,而在活动重新开始后才显示。
viewModel
public class MainViewModel extends ViewModel {
private static final String POST_WORKER_TAG = "WorkerTag";
private LiveData<List<WorkInfo>> workInfo;
@ViewModelInject
public MainViewModel(WorkManager workManager) {
this.workManager = workManager;
this.workInfo = workManager.getWorkInfosByTagLiveData(POST_WORKER_TAG);
}
public LiveData<List<WorkInfo>> getWorkInfo() {
return workInfo;
}
public void startPostWorker() {
OneTimeWorkRequest postRequestWorker = new OneTimeWorkRequest.Builder(PostRequestWorker.class)
.addTag(POST_WORKER_TAG)
.build();
workManager.enqueue(postRequestWorker);
}
在活动中onCreate()
MainViewModel mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
mainViewModel.getWorkInfo().observe(this,workInfos -> {
if (workInfos != null && !workInfos.isEmpty()) {
WorkInfo workInfo = workInfos.get(workInfos.size() - 1);
if (workInfo.getState() == WorkInfo.State.ENQUEUED) {
Toast.makeText(context,"ENQUEUED",Toast.LENGTH_SHORT).show();
} else if (workInfo.getState() == WorkInfo.State.SUCCEEDED) {
Toast.makeText(context,"SUCCEEDED",Toast.LENGTH_SHORT).show();
} else if (workInfo.getState() == WorkInfo.State.FAILED) {
Toast.makeText(context,"FAILED",Toast.LENGTH_SHORT).show();
}
}
});
解决方法
LiveData在注册新观察者时重新发布数据,以避免您可以在发布更新后设置布尔值或使用Rx,SingleLiveData或Kotlin Flow实施布尔值
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。