WorkerManager

根据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()
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容