zoukankan      html  css  js  c++  java
  • Android WorkManager使用入门

    WorkManager使用入门

    WorkManager提供了任务调度功能,我们可以对工作进行标记或命名。
    我们用一个示例来演示如何使用WorkManager。本文使用Kotlin。

    入门示例

    gradle引入依赖

    将以下依赖项添加到应用模块的build.gradle文件中

    dependencies {
        def work_version = "2.5.0"
    
        // (Java only)
        implementation "androidx.work:work-runtime:$work_version"
    
        // Kotlin + coroutines
        implementation "androidx.work:work-runtime-ktx:$work_version"
    
        // optional - RxJava2 support
        implementation "androidx.work:work-rxjava2:$work_version"
    
        // optional - GCMNetworkManager support
        implementation "androidx.work:work-gcm:$work_version"
    
        // optional - Test helpers
        androidTestImplementation "androidx.work:work-testing:$work_version"
    
        // optional - Multiprocess support
        implementation "androidx.work:work-multiprocess:$work_version"
    }
    

    添加依赖项并同步 Gradle 后,下一步要定义一些工作。

    定义工作

    这里的工作为方便测试进行了简化。实际项目中请改为具体的业务代码。
    新建UploadWorker类继承Worker类。需要2个参数context: Context, params: WorkerParameters
    doWork()方法中是我们的具体任务,在WorkManager提供的后台线程上异步运行。

    class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
        override fun doWork(): Result {
            for (i in 1..3) {
                Log.d(TAG, "模拟执行任务 ${tags.first()} ${Thread.currentThread()}")
                Thread.sleep(100) // 模拟耗时
            }
            return Result.success()
        }
    }
    

    doWork()方法中我们打印当前线程信息。后面看看线程运行情况。

    任务执行完毕,doWork()需要返回一个Result

    • Result.success():工作成功完成
    • Result.failure():工作失败
    • Result.retry():工作失败,应根据其重试政策在其他时间尝试

    创建 WorkRequest

    前面我们定义好了工作类UploadWorkerWorkManager可以调度工作,让工作运行起来。工作可以在某个时间段内定期运行,也可以只运行一次。
    要运行工作,涉及到WorkRequest类和它的子类。

    这里我们演示只运行1次的工作,使用OneTimeWorkRequest
    创建workA,作为一个Activity里的变量

    private val mWorkA = OneTimeWorkRequest.Builder(UploadWorker::class.java)
            .addTag("workA").build()
    

    创建workB

    val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
            .addTag("workB").build()
    

    将WorkRequest提交给WorkManager

    使用enqueue方法将WorkRequest提交给WorkManager。

    获取WorkManager的实例用WorkManager.getInstance(applicationContext)方法。

    mWorkA是变量

    WorkManager.getInstance(applicationContext).enqueue(mWorkA)
    // ...
    

    workB是每次都新建一个对象,然后交给WorkManager去执行。

    val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
            .addTag("workB").build()
    WorkManager.getInstance(applicationContext).enqueue(workB)
    

    执行工作器的确切时间取决于WorkRequest中使用的约束和系统优化方式。
    Google官方设计过WorkManager,能够在满足约束的情况下提供最佳行为。

    运行测试

    按钮A触发mWorkA,按钮B触发workB。分别点击按钮A/B

    模拟执行任务 workA Thread[pool-2-thread-3,5,main]
    模拟执行任务 workA Thread[pool-2-thread-3,5,main]
    模拟执行任务 workA Thread[pool-2-thread-3,5,main]
    点击按钮B Thread[main,5,main]
    模拟执行任务 workB Thread[pool-2-thread-1,5,main]
    模拟执行任务 workB Thread[pool-2-thread-1,5,main]
    模拟执行任务 workB Thread[pool-2-thread-1,5,main]
    

    观察log发现,工作的doWork()方法在WorkManager提供的后台线程上异步运行。
    主线程是[main,5,main],工作的线程是[pool-2-thread-3,5,main]

    而在实际操作中发现,多次点击按钮A,mWorkA只会执行第一次。后面再点击按钮A,mWorkA也不会执行了。

    小结

    这个例子介绍了如何引入WorkManager,定义工作(任务),排队执行任务。
    在使用方式上,让人联想到AsyncTask

    其他参考

    一个软件工程师的记录
  • 相关阅读:
    用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql
    用sqoop将mysql的数据导入到hive表中
    windows下启动mysql服务的命令行启动和手动启动方法
    使sqoop能够启用压缩的一些配置
    简易安装sqoop
    sqoop一些语法的使用
    mysql 视图
    MySQL 函数大全及用法示例
    MySQL 触发器 -1
    MySQL 函数
  • 原文地址:https://www.cnblogs.com/rustfisher/p/15161247.html
Copyright © 2011-2022 走看看