class CalculateWorker(context: Context, workerParams: WorkerParameters) : Worker(
context,
workerParams
) {
companion object {
@RequiresApi(Build.VERSION_CODES.M)
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(false)
.setRequiresCharging(false)
.setRequiresDeviceIdle(false)
.setRequiresStorageNotLow(false)
.build()
}
override fun doWork(): Result {
var index = inputData.getInt("index", 0)
if (index == 1) {
Thread.sleep(2000)
}
for (i in 0..100) {
index++
}
return Result.success(Data.Builder().putInt("result", index).build())
}
}
val mWorkManager = WorkManager.getInstance(this)
binding.mButtonOneTime.setOnClickListener {
val oneTimeWorkRequest = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 0).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequest.id)
.observe(this, {
Log.i("Simon", "doWork : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.enqueue(oneTimeWorkRequest)
}
binding.mButtonPeriodic.setOnClickListener {
val periodicWorkRequest =
PeriodicWorkRequest.Builder(CalculateWorker::class.java, 1, TimeUnit.MINUTES)
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 0).build())
.build()
mWorkManager.getWorkInfoByIdLiveData(periodicWorkRequest.id)
.observe(this, {
Log.i("Simon", "doWork : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.enqueue(periodicWorkRequest)
}
binding.mButtonExecuteSort.setOnClickListener {
val oneTimeWorkRequestA = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 1).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
val oneTimeWorkRequestB = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 2).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequestA.id)
.observe(this, {
Log.i("Simon", "doWork A : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequestB.id)
.observe(this, {
Log.i("Simon", "doWork B : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.beginWith(oneTimeWorkRequestA).then(oneTimeWorkRequestB)
.enqueue()
}
binding.mButtonExecuteSort2.setOnClickListener {
val oneTimeWorkRequestA = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 1).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
val oneTimeWorkRequestB = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 2).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
val oneTimeWorkRequestC = OneTimeWorkRequestBuilder<CalculateWorker>()
.setConstraints(constraints)
.setInputData(Data.Builder().putInt("index", 3).build())
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.HOURS)
.build()
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequestA.id)
.observe(this, {
Log.i("Simon", "doWork A : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequestB.id)
.observe(this, {
Log.i("Simon", "doWork B : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.getWorkInfoByIdLiveData(oneTimeWorkRequestC.id)
.observe(this, {
Log.i("Simon", "doWork C : ${it.outputData.getInt("result", 0)} ${it.state}")
})
mWorkManager.beginWith(listOf(oneTimeWorkRequestA, oneTimeWorkRequestB))
.then(oneTimeWorkRequestC)
.enqueue()
}
binding.mButtonCancelAll.setOnClickListener {
mWorkManager.cancelAllWork()
}