如何在WorkManager中处理异步任务详解

作者:湫水长天 时间:2021-09-12 14:05:29 

前言

WorkManager 是 Android Jetpack 中的新组件,用于负责管理后台任务。关于这个组件的介绍就不多说了,网上到处都是,这里分享一下在 WorkManager 中处理异步任务的方法。

我们知道,在 WorkManager 中,处理任务的方式是创建一个继承自 Worker 的任务类,实现 doWork() 方法,并在这个方法中实现我们自己的任务,然后返回 Result.success() 或 Result.failure() 来表示任务执行成功或者失败。在这里, doWork() 方法中的任务应该是同步的,这是很自然的,因为 doWork() 方法本身就是在子线程中执行,因此可以在 doWork() 方法中同步执行耗时操作。

但是些情况,我们想要执行的是异步任务,在 WorkManager 中,有两种比较好的处理异步任务的方案。

RxWorker

很多时候我们会使用 RxJava 来处理数据。幸运的是,我们可以使用 RxWorker 来处理异步任务。


dependencies {
...
implementation "android.arch.work:work-runtime:1.0.0-beta05"
implementation "android.arch.work:work-rxjava2:1.0.0-beta05"
}

然后,将之前集成 Work 的类改为继承 RxWorker ,然后实现 createWork() 方法,基本结构如下:


public class AsyncWorker extends RxWorker {

public AsyncWorker(Context appContext, WorkerParameters workerParams) {
 super(appContext, workerParams);
}

@Override
public Single<Result> createWork() {
 return remoteService.getMySingleResponse()
   .doOnSuccess(new Consumer() {
    @Override
    public void accept(Object object) throws Exception {
     // 处理任务
    }
   })
   .map(new Function() {
    @Override
    public Object apply(Object object) throws Exception {
     return Result.success();
    }
   })
   .onErrorReturn(new Function() {
    @Override
    public Object apply(Object object) throws Exception {
     return Result.failure();
    }
   });
}
}

很简单是吧?有一点要注意的是, createWork() 方法默认是在主线程中执行的,如果 10 分钟没有结束任务,就会自动取消。

ListenableWorker

当我们去查看 RxWorker 的源码时,就可以发现它是继承了 ListenableWorker 类,其实 Worker 也是通过继承 ListenableWorker 实现的。 因此,我们可以通过自定义 ListenableWorker 来实现相同的功能。

看一下 Worker 的源码,很简单:


public abstract class Worker extends ListenableWorker {
SettableFuture<Result> mFuture;
public Worker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
 super(context, workerParams);
}

@WorkerThread
public abstract @NonNull Result doWork();
@Override
public final @NonNull ListenableFuture<Result> startWork() {
 mFuture = SettableFuture.create();
 getBackgroundExecutor().execute(new Runnable() {
  @Override
  public void run() {
   Result result = doWork();
   mFuture.set(result);
  }
 });
 return mFuture;
}
}

可以里面主要使用了 SettableFuture 这个类,在 startWork() 里面先创建了 SettableFuture 对象,然后开了一个子线程,在子线程里面执行 doWork() 方法,完了就使用 mFuture.set() 方法将 Result 返回。

因此我们也可以模仿 Worker 类的写法,来实现自己的异步处理,简单地模板代码如下:


public class AsyncWorker extends ListenableWorker {
private SettableFuture<Result> mFuture;
public AsyncWorker(Context appContext,WorkerParameters workerParams) {
 super(appContext, workerParams);
}

@Override
public ListenableFuture<Result> startWork() {
 mFuture = SettableFuture.create();
 doSomeAsyncWork(new AsyncListener() {
  @Override
  public void success() {
   mFuture.set(Result.success());
  }

@Override
  public void fail() {
   mFuture.set(Result.failure());
  }
 });
 return mFuture;
}
}

来源:http://wl9739.github.io/2019/02/07/在WorkManager中处理异步任务/

标签:workmanager,异步,任务
0
投稿

猜你喜欢

  • SpringBoot使用Maven插件进行项目打包的方法

    2022-12-21 21:07:34
  • java编程实现根据EXCEL列名求其索引的方法

    2022-04-24 03:08:03
  • RocketMQ生产者一个应用不能发送多个NameServer消息解决

    2022-05-18 15:56:11
  • 一文了解自定义MVC框架实现

    2023-01-11 00:15:10
  • springboot 整合 seata的配置过程

    2023-01-13 01:28:33
  • Android完美实现平滑过渡的ViewPager广告条

    2023-10-01 13:05:31
  • c# 单例模式的实现方法

    2022-12-21 14:39:46
  • winform C#获得Mac地址,IP地址,子网掩码,默认网关的实例

    2021-06-28 20:45:50
  • 详解C#借助.NET框架中的XmlTextReader类读取XML的方法

    2023-01-18 23:31:47
  • JAVA版排序算法之快速排序示例

    2023-04-20 04:37:53
  • c#实现服务器性能监控并发送邮件保存日志

    2023-09-10 11:56:14
  • Java 实战练手项目之医院预约挂号系统的实现流程

    2023-11-24 00:42:36
  • java身份证合法性校验工具类实例代码

    2022-09-10 18:36:55
  • C#实现单例模式的几种方法总结

    2023-10-13 16:33:55
  • Android Studio 3.0的下载安装教程

    2021-08-10 04:00:45
  • SpringMVC如何接收参数各种场景

    2022-01-23 22:56:24
  • C# Random类随机函数实例详解

    2021-09-12 04:26:42
  • 简单了解Java方法的定义和使用实现详解

    2023-10-30 16:12:46
  • C#中Socket通信用法实例详解

    2022-07-10 03:42:03
  • Java最简洁数据结构之冒泡排序快速理解

    2023-12-01 06:31:52
  • asp之家 软件编程 m.aspxhome.com