Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Putting Work Manager To Work

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Putting Work Manager To Work

Slides from my talk at Chicago Roboto 2019

Avatar for Adnan A M

Adnan A M

April 26, 2019
Tweet

More Decks by Adnan A M

Other Decks in Technology

Transcript

  1. Options 4 Threads/Executors 4 Services 4 Alarm Manager 4 Async

    Tasks 4 Download Manager Chicago Roboto 2019 4
  2. Restrictions 4 Doze Mode/Battery Saver 4 Background Services Limitations 4

    App Standby Buckets 4 Restricted Background Apps Chicago Roboto 2019 5
  3. Work Manager The brand new magic tool to help you

    perform Background Work seamlessly. Chicago Roboto 2019 6
  4. The One With All The Features 4 API 14+ 4

    Constraints 4 Multiple Chained Tasks 4 Guranteed Work Execution (Full Offline Mode Support) Chicago Roboto 2019 7
  5. A sample is worth a thousand explanations 1 Me @

    5 AM today Chicago Roboto 2019 8
  6. Implementing Work Manager - Basic 4 Add Dependency 4 Extend

    Worker class 4 Override doWork method 4 Return result 4 Schedule Work Chicago Roboto 2019 9
  7. Implementing Work Manager - Basic The One With All The

    Dependencies dependencies { def work_version = 2.0.0 // (Java only) implementation "android.arch.work:work-runtime:$work_version" // Kotlin + coroutines implementation "android.arch.work:work-runtime-ktx:$work_version" // optional - RxJava2 support implementation "android.arch.work:work-rxjava2:$work_version" // optional - Test helpers androidTestImplementation "android.arch.work:work-testing:$work_version" } Chicago Roboto 2019 10
  8. Implementing Work Manager - Basic Extend Worker Class class SomeWorker(appContext:

    Context, workerParams: WorkerParameters): Worker(appContext, workerParams) { override fun doWork(): Result { someWork() return Result.SUCCESS } } Chicago Roboto 2019 11
  9. Implementing Work Manager - Basic Override doWork() class SomeWorker(appContext: Context,

    workerParams: WorkerParameters): Worker(appContext, workerParams) { override fun doWork(): Result { someWork() return Result.SUCCESS } } Chicago Roboto 2019 12
  10. Implementing Work Manager - Basic Return Result class SomeWorker(appContext: Context,

    workerParams: WorkerParameters): Worker(appContext, workerParams) { override fun doWork(): Result { someWork() return Result.SUCCESS } } Chicago Roboto 2019 13
  11. Implementing Work Manager - Basic Schedule Work val myWorkRequest =

    OneTimeWorkRequest.Builder(SomeWorker) .build() WorkManager.getInstance().enqueue(myWorkRequest) Chicago Roboto 2019 14
  12. Worker Class - Under The Hood Abstract class Extends ListenableWorker

    startWork() -> doWork() Chicago Roboto 2019 15
  13. Worker Class - Under The Hood @Override public final @NonNull

    ListenableFuture<Payload> startWork() { mFuture = SettableFuture.create(); getBackgroundExecutor().execute(new Runnable() { @Override public void run() { Result result = doWork(); mFuture.set(new Payload(result, getOutputData())); } }); return mFuture; } Chicago Roboto 2019 16
  14. The One With All The Work Request One Time Work

    Request Periodic Work Request Chicago Roboto 2019 18
  15. Periodic Work Request // Create a periodic work request with

    30 mins as repeat interval val repeatInterval = 30 val somePeriodicWorkRequest = PeriodicWorkRequest.Builder(SomeWorker, repeatInterval, TimeUnit.MINUTES).build() Chicago Roboto 2019 20
  16. TAGS - Sample val someWorkRequest = OneTimeWorkRequest.Builder(SomeWorker) .addTag("Sync") .addTag("Job Status")

    .build() val someOtherWorkRequest = OneTimeWorkRequest.Builder(SomeWorker) .addTag("Sync") .addTag("Driver Activity") .build() Chicago Roboto 2019 22
  17. The One With The Constraints 4 Network 4 Battery 4

    Storage 4 Device State Chicago Roboto 2019 23
  18. Constraints - Sample private fun getWorkerConstraints(): Constraints { return Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED)

    .setRequiresBatteryNotLow(true) .setRequiresCharging(true) .setRequiresDeviceIdle(false) .setRequiresStorageNotLow(false) .build() } Chicago Roboto 2019 24
  19. The One Where It All Made Sense WorkManager.getInstance().beginWith(work1, work2, work3)

    .then(work4) .then(work5) .then(work7) .enqueue() Chicago Roboto 2019 27
  20. Complex chains/combines A | +----------+ | | B C |

    +----+ | | D E Chicago Roboto 2019 28
  21. Complex chains/combines A | +----------+ | | B C +----------+

    | +----------+ | | D E Chicago Roboto 2019 30
  22. Complex chains/combines Chain 1 Chain 2 A C | |

    B D +----------+ | E Chicago Roboto 2019 32
  23. Complex chains/combines WorkContinuation chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB); WorkContinuation chain2

    = WorkManager.getInstance() .beginWith(workC) .then(workD); WorkContinuation chain3 = WorkContinuation.combine(chain1, chain2) //Combines chain 1 and 2 .then(workE); chain3.enqueue(); Chicago Roboto 2019 33
  24. The One With The Unique Work Ensure single instance of

    same work val uniqueName = "MyUniqueName" val myWorkRequest = OneTimeWorkRequest.Builder(SomeWorker).build() WorkManager.getInstance().enqueueUniqueWork(uniqueName, ExistingWorkPolicy.REPLACE, myWorkRequest) Chicago Roboto 2019 34
  25. Tips/Gotchas 4 Use Tags to limit scopes and group operations

    together 4 Multiple chained jobs with different constraints can run at different times 4 Evaulate trigger points for all your workers Chicago Roboto 2019 41
  26. Tips/Gotchas 4 One Time Work & Periodic Work share tags

    4 Check isStopped() before doing work 4 Cancel all work before removing WM Chicago Roboto 2019 42
  27. Summary 4 Runs Work On Background Thread 4 Guarantees execution

    across system reboots 4 Runs work using best possible method based on API level of the user's device 4 Wavelock Management Chicago Roboto 2019 43
  28. Summary - Under The Hood 4 Uses Room DB to

    save data 4 Keeps snapshots of work being done, hence queryable 4 Restarts pending work 4 Runs your work on a separate thread but synchronously using a Single Threaded Executor Chicago Roboto 2019 44
  29. The One With The Endgame 4 Reach out to me

    at @AdnanM0123 4 Talk about WM or droidcon India or anything Android 4 Well, anything except Flutter/RN maybe ? 4 And.... Chicago Roboto 2019 45