简体   繁体   中英

WorkManager observing state with Livedata

I'm using OneTimeWorkRequest to do some work and observing its status with getWorkInfosByTagLiveData(), after application is killed and/or activity is recreated and observer is created again in onCreate(),i'm receiving recently done work infos and toast message is triggered, i think WorkManager somehow caches recently done workInfos. I want to only show toast when work is currently running with state changes and not after activity recreation.

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);
    }


in activity 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 实现它

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM