CoroutineWorker使用

95 阅读1分钟
/**
 * 后台任务管理机制
 * implementation 'androidx.work:work-runtime-ktx:2.8.1'
 */
class NetWorkWorker(
    context: Context,
    params: WorkerParameters
): CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        return try {
            // 后台处理网络任务
            val response = dataFromServer()
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }

    private fun dataFromServer(): Any {
        return 0
    }
}

/**
 * 使用NetworkType约束仅在wifi下执行后台任务
 * 约束仅在电量充足时执行后台任务
 */
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)
    .setRequiresBatteryNotLow(true)
    .build()

// 15分钟执行一次的周期任务
val periodicWorkRequest = PeriodicWorkRequestBuilder<NetWorkWorker>(15, TimeUnit.MINUTES)
    .setConstraints(constraints)
    .build()

// 单次任务
val oneTimeWorkRequest = OneTimeWorkRequestBuilder<NetWorkWorker>()
    .setConstraints(constraints)
    .build()

/**
 * 调度或取消任务
 */
fun dispatcher(context: Context) {
    WorkManager.getInstance(context).enqueue(periodicWorkRequest)
    WorkManager.getInstance(context).cancelWorkById(periodicWorkRequest.id)
}

fun handleResult(context: Context, lifecycleOwner: LifecycleOwner) {
    WorkManager.getInstance(context)
        .getWorkInfoByIdLiveData(periodicWorkRequest.id)
        .observe(lifecycleOwner) { workInfo ->
            workInfo?.let {
                if (workInfo.state.isFinished) {
                    // 任务完成,处理结果
                }
            }
        }
}