Search code examples
androidandroid-jetpackandroid-workmanager

WorkManager 2.0.1 to 2.1.0 api change "setInitialDelay" when migrating from V1


I have a android library which uses Work manager to handle task schedulings. For backward compatibity, I made the library using support library.

since setInitialDelay is moved to parent class in WorkManager v2.1.0, if the library uses this (while using WorkManager v1 and support library), the Jetifier will make WorkManger v1 just like WorkManager v2.0.1 and not v2.0.2. So this will cause the error:

Caused by: java.lang.NoSuchMethodError:
 No virtual method setInitialDelay(JLjava/util/concurrent/TimeUnit;)Landroidx/work/OneTimeWorkRequest$Builder;
 in class Landroidx/work/OneTimeWorkRequest$Builder;

The old workManager (2.0.1) code is like this:

abstract class WorkRequest {
    abstract static class Builder<B extends Builder, W extends WorkRequest> {
    }
}

class OneTimeWorkRequest extends WorkRequest {
   static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
       public @NonNull Builder setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
          ....
       }
  }
}

And the new one (^2.1.0) is :

abstract class WorkRequest {
    abstract static class Builder<B extends Builder, W extends WorkRequest> {
         public @NonNull B setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
              ...
         }
    }
}

class OneTimeWorkRequest extends WorkRequest {
   static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
  }
}

TL;DR

If developer uses workManager v2.1.0, what will happen to libraries that have WorkManager v1 and use Jetifer to transform to v2?


Solution

  • Unfortunately, the API change is a breaking and to resolve this, you must migrate the project to AndroidX.

    Further changes of androidx.workmanager will not consider compatibility to android.arch artifact.