Search code examples
androidarraysandroid-architecture-componentsandroid-jetpackandroid-workmanager

How to send a byteArray to Worker class when implementing WorkManger?


I am trying to send a byteArray as an input data to my Worker Class inside the WorkRequest. Is there a way to send byteArray and receive the same inside the worker class?

I have tried to send IntArray and I am able to achieve the result.

Implementation:

//work request
 val workRequest = OneTimeWorkRequest.Builder(MyWroker::class.java)
                  .setInputData(createInputData())
                  .build()
//create Input Data for work request
fun createInputData(): Data {
        return Data.Builder()
                .putString(FIRST_KEY, "My value")
                .putInt(SECOND_KEY, 5)
                .putByteArray(getByteArray())
                .build()
    }

I am getting an error cannot resolve method getByteArray(). I have read the documentation of Data class and there is no such method available.

Solution

  • The support to store and retrieve bytes and byte arrays into Data object has been added to WorkManager v2.1.0-alpha01.

    You can add WorkManager's KTX and use OneTimeWorkRequestBuilder<>() and workDataOf() in your work request (or use the putByteArray() method of the Data.Builder object):

    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
        .setInputData(createInputData())
        .build()
    
    private fun createInputData() = workDataOf(
        FIRST_KEY to "My value", 
        SECOND_KEY to byteArrayOf(0x2E, 0x38))
    

    and then retrieve the byte array in your worker using something like:

    class MyWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
    
        override fun doWork(): Result {
            val myByteArray = inputData.getByteArray()
    
            // Do something with the ByteArray
    
            Result.success()
        }
    }