MainActivity와 WorkManager 간의 데이터 전달 방법

최대환·2023년 12월 31일
0

MainActivity에서 WorkManager로 데이터를 전달하려면 .setInputData(myData)를 사용해 보내면 됩니다. 아래 코드는 ab라는 키로 각각 10, 20이라는 값을 가진 Data를 생성하고, 이를 WorkManagerB로 전달하는 예시입니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData : Data = workDataOf(
            "a" to 10,
            "b" to 20
        )

        val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().setInputData(myData).build()
        WorkManager.getInstance(this).enqueue(workManagerB)
    }
}

WorkManager에서는 inputData.getInt("a", 1000)를 사용해서 값을 받을 수 있습니다.

class WorkManagerB(context : Context, workerParameters: WorkerParameters) :
    Worker(context, workerParameters){

    override fun doWork(): Result {
        val a = inputData.getInt("a", 1000)
        val b = inputData.getInt("b", 2000)
        val c = inputData.getInt("c", 3000)

        Log.d("WorkManagerB", a.toString())
        Log.d("WorkManagerB", b.toString())
        Log.d("WorkManagerB", c.toString())

        return Result.success()
    }
}

MainActivity로 값을 보낼 때는 return Result.success(output)를 사용해서 보내면 됩니다.

class WorkManagerB(context : Context, workerParameters: WorkerParameters) :
    Worker(context, workerParameters){

    override fun doWork(): Result {
        val a = inputData.getInt("a", 1000)
        val b = inputData.getInt("b", 2000)
        val c = inputData.getInt("c", 3000)

        Log.d("WorkManagerB", a.toString())
        Log.d("WorkManagerB", b.toString())
        Log.d("WorkManagerB", c.toString())

        val output : Data = workDataOf("result" to 123)

        return Result.success(output)
    }
}

아래 코드는 WorkManager로부터 결과 값을 반환받는 방법을 보여줍니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData : Data = workDataOf(
            "a" to 10,
            "b" to 20
        )

        val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().setInputData(myData).build()
        WorkManager.getInstance(this).enqueue(workManagerB)

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(workManagerB.id)
            .observe(this, Observer { info ->
                if(info != null && info.state.isFinished) {
                    val result = info.outputData.getInt("result", 299)
                    Log.d("MainActivity", result.toString())
                }
            })
    }
}
profile
나의 개발지식 output 공간

0개의 댓글