Android Jetpack WorkManager 周期性任务/任务链与任务组合

周期性任务

      //周期性任务 //每隔15分钟去执行任务
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            PeriodicWorkRequest.Builder(MyWork::class.java, Duration.ofMinutes(15)).build()
        }

任务链

第一个work

package com.anguomob.jecpack.work

import android.content.Context
import android.os.SystemClock
import android.util.Log
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters

class MyWork(val context: Context, val workerParameters: WorkerParameters) :
    Worker(context, workerParameters) {
    private val TAG = "MyWork"
    override fun doWork(): Result {
        SystemClock.sleep(2000);
        val inputData = inputData.getString("input_data")

        Log.d(TAG, "MyWork doWork: ${System.currentTimeMillis()}")
        Log.d(TAG, "MyWork inputData: ${inputData}")
        //任务执行完毕 将数据返回
        val outputData = Data.Builder()
            .putString("output_data", "执行成功")
            .build()

        return Result.success(outputData)
    }
}

第二个work

package com.anguomob.jecpack.work

import android.content.Context
import android.os.SystemClock
import android.util.Log
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters

class MyWorkB(val context: Context, val workerParameters: WorkerParameters) :
    Worker(context, workerParameters) {
    private val TAG = "MyWorkB"
    override fun doWork(): Result {
        SystemClock.sleep(2000);
        val inputData = inputData.getString("input_data")

        Log.d(TAG, "MyWork doWork: ${System.currentTimeMillis()}")
        Log.d(TAG, "MyWork inputData: ${inputData}")
        //任务执行完毕 将数据返回
        val outputData = Data.Builder()
            .putString("output_data", "执行成功")
            .build()

        return Result.success(outputData)
    }
}

代码

    fun addWork2(view: View) {
        //一种更简介的获取方式
        val work = OneTimeWorkRequest.from(MyWork::class.java)
        val workB = OneTimeWorkRequest.from(MyWorkB::class.java)

        //先执行 work  后执行workB
        WorkManager.getInstance(this)
            .beginWith(work)
            .then(workB)
            .enqueue()
    }

 打印顺序将会是先第一个work 在workB 这样是链条样式的调用。所以叫任务链

现在有需求

a、b、c、d顺序不做要求。但是必须完成后才能执行e

WorkA代码

package com.anguomob.jecpack.work

import android.content.Context
import android.os.SystemClock
import android.util.Log
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters

class MyWorkA(val context: Context, val workerParameters: WorkerParameters) :
    Worker(context, workerParameters) {
    private val TAG = javaClass.simpleName
    override fun doWork(): Result {
        SystemClock.sleep(2000);
        val inputData = inputData.getString("input_data")

        Log.d(TAG, "MyWork doWork: ${System.currentTimeMillis()}")
        Log.d(TAG, "MyWork inputData: ${inputData}")
        //任务执行完毕 将数据返回
        val outputData = Data.Builder()
            .putString("output_data", "执行成功")
            .build()

        return Result.success(outputData)
    }
}

其他的B.C.D.E 都是改了类名而已不再贴出来

代码

    fun addWork2(view: View) {
        //一种更简介的获取方式
        val workA = OneTimeWorkRequest.from(MyWorkA::class.java)
        val workB = OneTimeWorkRequest.from(MyWorkB::class.java)
        val workC = OneTimeWorkRequest.from(MyWorkC::class.java)
        val workD = OneTimeWorkRequest.from(MyWorkD::class.java)
        val workE = OneTimeWorkRequest.from(MyWorkE::class.java)

        //先执行 workA,workB,workC,workE  后执行workE
        WorkManager.getInstance(this)
            .beginWith(arrayListOf(workA,workB,workC,workD))
            .then(workE)
            .enqueue()
    }

日志

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/124938675