Work Inputs

However, doWork() would crash if we scheduled it this way. That comes back to those getInputData() calls from our doWork() method.

Often, our work needs data describing that work. In the case of DownloadWorker, we need to know:

WorkManager has a solution for this, via the Data class (perhaps named after the android character in Star Trek properties) (or perhaps not).

Data is a key-value store. The values are simple primitives plus arrays of simple primitives. We can package information into a Data, attach it to the work request, and then get that information from inside of doWork().

Reading the Data is a matter of calling getInputData() inside of doWork(), then calling getter methods based on type (e.g., getString()). Those getter methods take the key under which the data is stored as a parameter. Getters for primitive types (e.g., getInt(), getBoolean()) also have a second parameter to use for the default response, if there is nothing associated with that key in the Data.

Putting Data into a request is a matter of creating a Data instance using a Data.Builder, which contains the corresponding setter methods (e.g., putString()), such as in this Java snippet:

OneTimeWorkRequest downloadWork=
  new OneTimeWorkRequest.Builder(DownloadWorker.class)
    .setInputData(new Data.Builder()
      .putString(DownloadWorker.KEY_URL,
        "https://commonsware.com/Android/Android-1_0-CC.pdf")
      .putString(DownloadWorker.KEY_FILENAME, "oldbook.pdf")
      .build())
    .build();

WorkManager.getInstance(getApplicationContext()).enqueue(downloadWork);

Here, we fill in the two values that the DownloadWorker is expecting, using setInputData() to attach the Data to our OneTimeWorkRequest.

Note that there is a 10KB limit on the size of the Data. Data is there mostly to provide identifiers, such as the URL and filename that we are using here. Use the Data for unique information, stuff that the Worker subclass cannot obtain from other sources (e.g., your Room database, your SharedPreferences).


Prev Table of Contents Next

This book is licensed under the Creative Commons Attribution-ShareAlike 4.0 International license.