• Android Jetpack学习系列——WorkManager


    1.添加依赖
    首先,确保您的项目已启用AndroidX,并在build.gradle(Module: app)文件中添加WorkManager的依赖项:

    1. dependencies {
    2. // ... 其他依赖项 ...
    3. implementation "androidx.work:work-runtime:2.7.1"
    4. // 如果您需要使用其约束服务(如WorkManager的UI库),还需要添加以下依赖:
    5. implementation "androidx.work:work-manager-ktx:2.7.1"
    6. }

    2. 创建Worker类
    创建一个继承自Worker的Java类,负责执行具体的后台任务逻辑:

    1. import android.content.Context;
    2. import androidx.work.Worker;
    3. import androidx.work.WorkerParameters;
    4. public class MyBackgroundTaskWorker extends Worker {
    5. public MyBackgroundTaskWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    6. super(context, workerParams);
    7. }
    8. @Override
    9. public Result doWork() {
    10. // 在这里编写您的后台任务逻辑
    11. // 示例:执行简单的网络请求
    12. boolean success = performNetworkRequest();
    13. if (success) {
    14. return Result.success();
    15. } else {
    16. // 处理错误或重试(根据实际需求)
    17. return Result.failure();
    18. }
    19. }
    20. private boolean performNetworkRequest() {
    21. // 实现网络请求逻辑,返回true表示成功,false表示失败
    22. // 此处仅为示例,实际应替换为您的网络库调用
    23. return true;
    24. }
    25. }

    3. 调度任务
    在应用的适当位置(如Activity、Fragment或ViewModel)使用WorkManager来调度任务:

    1. import androidx.annotation.NonNull;
    2. import androidx.work.WorkManager;
    3. public class MainActivity extends AppCompatActivity {
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. // 创建OneTimeWorkRequest实例
    9. OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyBackgroundTaskWorker.class)
    10. .build();
    11. // 获取WorkManager实例
    12. WorkManager workManager = WorkManager.getInstance(this);
    13. // 提交任务到WorkManager
    14. workManager.enqueue(myWorkRequest);
    15. }
    16. }

    4. 配置任务参数与约束
    若需要为任务指定额外参数、设置约束条件(如网络状态、设备充电状态等)或设定任务之间的依赖关系,可以如下操作:

    1. // 构建数据对象,传递给Worker
    2. Data inputData = new Data.Builder()
    3. .putString("key", "value")
    4. .build();
    5. OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyBackgroundTaskWorker.class)
    6. .setInputData(inputData) // 设置输入数据
    7. .setConstraints( // 设置约束条件
    8. new Constraints.Builder()
    9. .setRequiredNetworkType(NetworkType.CONNECTED) // 需要网络连接
    10. .setRequiresCharging(true) // 设备需处于充电状态
    11. .build())
    12. .build();
    13. // 如果有任务依赖,可以使用WorkContinuation API
    14. List<OneTimeWorkRequest> dependentTasks = ...; // 创建依赖任务列表
    15. WorkContinuation continuation = workManager.beginWith(dependentTasks).then(myWorkRequest);
    16. continuation.enqueue();

    5. 监听任务状态与结果
    为了监听任务的状态变化或获取任务完成后的结果,可以使用WorkManager提供的回调机制:

    1. // 注册观察者以接收任务状态更新
    2. myWorkRequest.getId().observe(this, new Observer() {
    3. @Override
    4. public void onChanged(WorkInfo workInfo) {
    5. if (workInfo != null) {
    6. WorkInfo.State state = workInfo.getState();
    7. switch (state) {
    8. case ENQUEUED:
    9. // 任务已加入队列
    10. break;
    11. case RUNNING:
    12. // 任务正在运行
    13. break;
    14. case SUCCEEDED:
    15. // 任务成功完成
    16. Data outputData = workInfo.getOutputData();
    17. // 处理输出数据(如果有的话)
    18. break;
    19. case FAILED:
    20. case CANCELLED:
    21. // 任务失败或被取消
    22. break;
    23. }
    24. }
    25. }
    26. });

    6. 单元测试
    为了确保Worker的正确性和稳定性,可以为其编写单元测试。WorkManager提供了TestWorkerBuilder等工具类,便于模拟和验证Worker的行为:

    1. import androidx.work.testing.TestWorkerBuilder;
    2. import org.junit.Before;
    3. import org.junit.Test;
    4. import static org.junit.Assert.assertEquals;
    5. public class MyBackgroundTaskWorkerTest {
    6. private MyBackgroundTaskWorker worker;
    7. @Before
    8. public void setUp() {
    9. worker = new TestWorkerBuilder<MyBackgroundTaskWorker>(MyBackgroundTaskWorker.class)
    10. .setInputData(...) // 可选:设置测试输入数据
    11. .build();
    12. }
    13. @Test
    14. public void testDoWork_success() {
    15. // 模拟网络请求成功
    16. worker.setWorkerResult(Worker.Result.SUCCESS);
    17. // 执行doWork方法并验证结果
    18. assertEquals(Worker.Result.SUCCESS, worker.doWork());
    19. }
    20. @Test
    21. public void testDoWork_failure() {
    22. // 模拟网络请求失败
    23. worker.setWorkerResult(Worker.Result.FAILURE);
    24. // 执行doWork方法并验证结果
    25. assertEquals(Worker.Result.FAILURE, worker.doWork());
    26. }
    27. }

  • 相关阅读:
    Segmentation fault 的bug解决
    GIS工具maptalks开发手册(二)01-01之Geometry转化为GeoJSON——渲染点
    微信小程序开发整理-mp1
    原型模式--深复制/浅复制
    ubuntu下Docker的简单使用并利用主机显示
    C# GFPGAN 图像(人脸面部)修复
    NUMPY
    FlinkCDC介绍及使用
    C51--单片机中断
    pod服务质量类别
  • 原文地址:https://blog.csdn.net/weixin_53324308/article/details/138077506