Unique OneTimeWorkRequest in Workmanager

前端 未结 4 1566
[愿得一人]
[愿得一人] 2020-12-31 09:07

We are using OneTimeWorkRequest to start background task in our project.

  1. At application start, we are starting the OneTimeWorkRequest (say req A)
  2. De
4条回答
  •  耶瑟儿~
    2020-12-31 09:11

    Edit 2:

    Nov 8th release notes:

    https://developer.android.com/jetpack/docs/release-notes

    Add WorkManager.enqueueUniqueWork() API to enqueue unique OneTimeWorkRequests without having to create a WorkContinuation.

    This says, alpha11 has this new API to uniquely enqueue a onetimework.

    I tried changing the code as follows:

    OneTimeWorkRequest impWork = new OneTimeWorkRequest.Builder(WorkerNotesAttachment.class)
                .addTag(RWORK_TAG_NOTES)
                .build();
    WorkManager.getInstance().enqueueUniqueWork(RWORK_TAG_NOTES, ExistingWorkPolicy.REPLACE, impWork);
    

    I tried using the beginUniqueWork API. But it fails to run sometimes. So I ended up writing the following function.

    public static boolean isMyWorkerRunning(String tag) {
        List status = null;
        try {
            status = WorkManager.getInstance().getStatusesByTag(tag).get();
            boolean running = false;
            for (WorkStatus workStatus : status) {
                if (workStatus.getState() == State.RUNNING
                        || workStatus.getState() == State.ENQUEUED) {
                    return true;
                }
            }
            return false;
    
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return false;
    }
    

    We need to get all the WorkStatus objects and check if atleast one of them is in running or Enqueued state. As the system keeps all the completed works in the DB for few days (Refer pruneWork()), we need to check all the work instances.

    Invoke this function before starting the OneTimeWorkRequest.

    public static void startCacheWorker() {
    
        String tag = RWORK_TAG_CACHE;
    
        if (isMyWorkerRunning(tag)) {
            log("worker", "RWORK: tag already scheduled, skipping " + tag);
            return;
        }
        // Import contact for given network
        OneTimeWorkRequest impWork = new OneTimeWorkRequest.Builder(WorkerCache.class)
                .addTag(tag)
                .build();
        WorkManager.getInstance().enqueue(impWork);
    }
    

提交回复
热议问题