Android Workmanager

874 Views Asked by At

I'm having trouble figuring out how to use Android's Workmanager. Essentially, I want to make a OneTime request with a time delay, determine success, then do some stuff. The Worker class does NOTHING.

What I'm expecting is a SUCCESS code to be returned after the time delay. That is, the sole purpose of my Workmanager code is to provide a delay.

I know there are many other ways to effect a delay but my understanding is that Android "protects" Workmanager Workers better than, say, AlarmManager.

Unfortunately, I can't make it happen.

Here's what I've done

  1. Extended my activity to include LifecycleOwner
  2. Added the required getLifeCycle method, as below

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        Log.d (TAG, "getLifecycle(): " + getLifecycle());
        return getLifecycle();
    }
    
  3. Here's the Worker class

    public class makeAlarm extends Worker {
    
        public makeAlarm(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
            super(context, params);
        }
    
        @Override
        public Result doWork() {
            // Do the work here--in this case, do nothing
    
            // Indicate whether the task finished successfully with the Result
            return Result.success();
       }
    }
    
  4. And here's my action code

    // Create a OneTimeWorkRequest that delays "success" by the required time
    OneTimeWorkRequest makeAlarmWorkRequest = new OneTimeWorkRequest.Builder(makeAlarm.class)
            .setInitialDelay(120, TimeUnit.SECONDS)
            .build();
    WorkManager.getInstance(this).enqueue(makeAlarmWorkRequest);
    
    // The following stmt. shows what appears to be a valid id
    Log.d (TAG, "makeAlarmWorkRequest.getId(): " + makeAlarmWorkRequest.getId());
    
    WorkManager.getInstance(this).getWorkInfoByIdLiveData(makeAlarmWorkRequest.getId())
            .observe(myLifecycleOwner, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null && workInfo.getState() == WorkInfo.State.SUCCEEDED) {
    
                    // Some amazing work here...
    
                    }
                }
            });
    

I've tried a number of variations but haven't had success. The above code results in a stack overflow crash. Help!

0

There are 0 best solutions below