

在 WorkManager 中处理异步任务
source link: http://wl9739.github.io/2019/02/07/在WorkManager中处理异步任务/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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; } }
Recommend
-
51
5月8号, I/O大会上又推出了两个新的Architeture Component库: Navigation与WorkManager. 这里就先介绍一下WorkManager. 一. WorkManager的一句话介绍 其实就是"管理一些要在后台工作的任务,
-
64
原文地址:Services. The life with/without.WorkManager 原文作者:Yonatan V. Levin 随着Android版本的不断更新,如何正确的处理后台任务变得越来越复杂。因此, Google发布了 WorkMan
-
68
Android Jetpack带来WorkManager、Navigation等特性
-
85
At Google I/O 2018 , Google announced the WorkManager library as part of the Android Jetpack component set. Moving forward, WorkManager replaces JobScheduler as...
-
66
WorkManager is for deferrable background task that needs a guaranteed execution, let’s get started an example to explan how to use it Overview One of the core features in our app are publishin...
-
45
Android Jetpack WorkManager Stable Release 2019-03-06ad...
-
33
一、定义: 作为 Android Jetpack 中的新组件,WorkManager 负责用来管理后台任务,说简单点则和异步任务Task或者 Service 作...
-
27
-
9
一、WorkManager概述1.1 WorkManager简介在Android应用开发中,或多或少的会有后台任务的需求,根据需求场景的不同,Android为后台任务提供了多种不同的解决方案,如Service、Loader、JobScheduler和AlarmManger等。后台任务通常用在不需要用...
-
7
在Winform开发中有时候我们为了不影响主UI线程的处理,以前我们使用后台线程BackgroundWorker来处理一些任务操作,不过随着异步处理提供的便利性,我们可以使用Async-Awati异步任务处理替换原来的后台线程BackgroundWorker处理方式,更加的简洁明了。 在一些...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK