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

Hiring WorkManager for your Background Jobs

Avatar for Mahima Mahima
September 21, 2019

Hiring WorkManager for your Background Jobs

WorkManager is a component of the Jetpack library. Being a wrapper around the existing background processing libraries, it provides a clever way to handle background tasks in Android.

Get an overview of the existing background processing options in Android. Understand why there was a need for a new API like WorkManager and how it works under the hood. Learn about its components and explore its features such as recurring tasks, chaining of tasks, specifying constraints and passing data to/reading data from tasks.

External links:
WorkManager article series on Medium - bit.ly/wm-series
Resources link on Google docs- bit.ly/wm-res

Presented at GDG DevFest Bangalore 2019.

Avatar for Mahima

Mahima

September 21, 2019

Other Decks in Programming

Transcript

  1. Hiring WorkManager for your Background Jobs Mahima MS Android Dev

    @ Stasis Co-organizer @ WomenDroid @mahi_amy stasislabs.com
  2. How do I do background work? Handlers/Threads AsyncTasks Loaders AlarmManager

    GCMNetworkManager android-job Services/IntentServices
  3. How do I do background work? Handlers/Threads SyncAdapters JobScheduler AsyncTasks

    Loaders AlarmManager GCMNetworkManager android-job priority job queue Services/IntentServices
  4. How do I do background work? Handlers/Threads SyncAdapters JobScheduler AsyncTasks

    Loaders AlarmManager GCMNetworkManager android-job priority job queue Services/IntentServices
  5. How do I do background work? Handlers/Threads Services/IntentServices SyncAdapters JobScheduler

    AsyncTasks Loaders AlarmManager GCMNetworkManager android-job priority job queue
  6. How do I do background work? Handlers/Threads Services/IntentServices SyncAdapters JobScheduler

    AsyncTasks Loaders AlarmManager GCMNetworkManager android-job priority job queue
  7. How do I do background work? JobScheduler Loaders AlarmManager priority

    job queue Handlers/Threads Services/IntentServices SyncAdapters AsyncTasks GCMNetworkManager android-job
  8. How do I do background work? Handlers/Threads Services/IntentServices SyncAdapters JobScheduler

    AsyncTasks Loaders AlarmManager GCMNetworkManager android-job priority job queue
  9. Inside the Database ID State Class Input merger i/p o/p

    Initial delay Interval duration Back off policy Back off delay Requires n/w 08d7e. 2 Uplo.. Overwr . 654 44 0 0 0 15000 1 d8d9... 0 Sync.. Overwr . Pup 890 15 60000 1 5000 0 WorkSpec
  10. Furrever • Display dog photos • Send a notification everyday

    with a random dog photo • Share multiple dog photos to friends
  11. class GetAllDogsWorker(context: Context, params: WorkerParameters) : Worker (context, params) {

    override fun doWork(): Result { // fetch data from API return Result.success() } } Define a work <.../>
  12. val getDogsWorkRequest = OneTimeWorkRequestBuilder<GetAllDogsWorker>() .build() Periodic WorkRequest val getRandomDogWorkRequest =

    PeriodicWorkRequestBuilder<GetRandomDogWorker> (24,TimeUnit.HOURS) .build() OneTime WorkRequest <.../> <.../> 10 mins
  13. val constraints = Constraints.Builder() .setRequiredNetworkType(CONNECTED) .setRequiresCharging(true) .build() val getDogsWorkRequest =

    OneTimeWorkRequestBuilder<GetAllDogsWorker>() .setConstraints(constraints) .build() Constraints <.../>
  14. class GetAllDogsWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override

    fun doWork(): Result { val apiUrl = getInputData().getString(KEY_API_URL) val response = getDogs(apiUrl) val outputData = workDataOf(KEY_NUM_DOGS to response.dogCount) return Result.success(outputData) } }
  15. WorkManager.getInstance(context) .getWorkInfoByIdLiveData(getDogsWorkRequest.id) .observe(lifecycleOwner, Observer { workInfo -> if (workInfo !=

    null && workInfo.state == WorkInfo.State.SUCCEEDED) { progressBar.visibility = View.GONE } }) <.../> Observing Work status
  16. States of a One Time Worker Blocked Enqueued Running Failed

    Succeeded Cancelled Retry Success Failure Cancel
  17. Input Mergers<.../> FilterWorkRequest1 Key 1 5 Key 2 “Pup” FilterWorkRequest2

    Key 1 8 Key 2 4 CompressWorker Key 1 8 Key 2 Exception CompressWorker Key 1 [5, 8] Key 2 Exception Overwrite Array
  18. @Test fun testGetDogsWorker() { val worker = TestWorkerBuilder<GetAllDogsWorker>( // define

    context & executor inputData = workDataOf(API_URL to url)).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } Testing your Work<.../>