美文网首页
WorkerManager

WorkerManager

作者: 丿灬序曲 | 来源:发表于2020-12-31 10:38 被阅读0次

根据google官方demo,自己仿写

google例子地址https://github.com/android/architecture-components-samples/tree/main/WorkManagerSample

MainActivity,调用位置

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

        findViewById<Button>(R.id.click_btn).setOnClickListener {
            val continuation = TestOperations.Builder(this, "nihaoa"/*可以改为url地址等数据*/)
                .setFirstWorker(true)
                .setTwoWorker(true)
                .build()
            continuation.continuation.enqueue()
        }

    }
    //简单的单任务处理
//    val myWorkRequest = OneTimeWorkRequestBuilder<GetNetData>()
//        .setInputData(workDataOf("ImageUrl" to "test"))
//        .setBackoffCriteria(
//            BackoffPolicy.LINEAR,
//            OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
//            TimeUnit.MILLISECONDS
//        )
//        .build()
//
//    WorkManager.getInstance(this).enqueue(myWorkRequest)
}

BaseWorker类,用来做多个任务的组合,类似责任链模式

abstract class BaseWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {
    override suspend fun doWork(): Result {
        val resourceUri = inputData.getString(Constants.KEY_IMAGE_URI)//获取传递过来的数据
        try {
            applyFilter(resourceUri!!)
            return Result.success()
        } catch (throwable: Throwable) {
            return Result.failure()
        }
    }

    abstract fun applyFilter(input: String): String
}

FirstWroker类,第一个任务类,继承BaseWorker,实现applyFilter方法

class FirstWroker(appContext: Context, workerParams: WorkerParameters) :
    BaseWorker(appContext, workerParams) {
    override fun applyFilter(input: String): String {
        var s = input+1;
        Log.d("testStr==1",s)
        return s
    }
}

TwoWorker类,第二个任务类,同样继承BaseWorker,实现applyFilter方法(和第一个没什么区别)

class TwoWorker(context: Context, parameters: WorkerParameters) : BaseWorker(context, parameters) {
    override fun applyFilter(input: String): String {
        var s = input + 2
        Log.d("testStr==2", s)
        return s
    }
}

TestOperations类,管理工作流程,比较重要,如果是多任务模式

class TestOperations constructor(val continuation: WorkContinuation) {
    class Builder(val mContext: Context, val testStr: String) {
        private var startFirst1: Boolean = false
        private var startTow2: Boolean = false
        fun setFirstWorker(startFirst: Boolean): Builder {
            startFirst1 = startFirst//
            return this
        }

        fun setTwoWorker(startTow: Boolean): Builder {
            startTow2 = startTow
            return this
        }

        fun build(): TestOperations {
            var continuation = WorkManager.getInstance(mContext)
                .beginUniqueWork(
                    Constants.TEST_KEY,
                    ExistingWorkPolicy.REPLACE,
                    OneTimeWorkRequest.from(CancelWorker::class.java)
                )//创建并添加多任务,beginUniqueWork可以放入多个不重复的任务,beginWith可以放入重复的
            if (startFirst1) {
                val test = OneTimeWorkRequestBuilder<FirstWroker>()
                    .setInputData(createInputData())
                    .build()
                continuation = continuation.then(test)//添加第一个任务,由于每个都继承BaseWorker,所以都会走Base的doWork方法
            }
            if (startTow2) {
                val test2 = OneTimeWorkRequestBuilder<TwoWorker>()
                    .setInputData(createInputData())
                    .build()
                continuation = continuation.then(test2)//添加第二个任务,由于每个都继承BaseWorker,所以都会走Base的doWork方法
            }
            return TestOperations(continuation)//返回给MainActivity,使MainActivity可以控制什么时候使用enqueue入队开启
        }

        private fun createInputData(): Data {
            //键值对获取地址参数,传递给不同的工作线程,比如google demo传递的是图片地址,所以会依次对图片做不同处理,顺序执行
            //如果为了获取上一个处理完的结果数据,理论上是可以通过键值对存储,依次修改,具体没有测试过
            return workDataOf(Constants.KEY_IMAGE_URI to testStr)
        }
    }

}

Constants,通用KEY

object Constants {
    const val TEST_KEY:String = "test_key" ;

    const val KEY_IMAGE_URI = "KEY_IMAGE_URI"
}

CancelWorker,做一些准备工作

class CancelWorker(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {
    override fun doWork(): Result {
        //做一些准备工作
        return Result.success()
    }

}

相关文章

  • WorkerManager

    根据google官方demo,自己仿写 google例子地址https://github.com/android/...

  • WorkerManager的使用

    我的第一篇笔记 刚从群里看到有人提到WorkManager可以管理后台任务的时候,感觉很吊的样子,之前没听说过,刚...

  • Android Workermanager使用

    Application贴 oncreate中 WorkManager.getInstance(getApplica...

  • Android WorkerManager 应用帖

    需求 特定的时间更新首页状态,频率较低,2次每天,时间不固定。 解决方案 Jetpack Architecture...

网友评论

      本文标题:WorkerManager

      本文链接:https://www.haomeiwen.com/subject/vfdloktx.html