如何在WorkManager中处理异步任务详解
前言
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;
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
相关文章
android音乐播放简单实现的简单示例(MediaPlayer)
本篇文章主要介绍了android音乐播放简单实现的简单示例(MediaPlayer),具有一定的参考价值,有兴趣的可以了解一下2017-08-08
Android开发使用RecyclerView添加点击事件实例详解
这篇文章主要为大家介绍了Android开发使用RecyclerView添加点击事件实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08
浅析AndroidStudio3.0最新 Android Profiler分析器(cpu memory network
Android Profiler分为三大模块: cpu、内存 、网络。本文给大家介绍AndroidStudio3.0最新 Android Profiler分析器(cpu memory network 分析器)的相关知识,他们的基本使用方法,在文中都给大家提到,具体内容详情大家通过本文一起学习吧2017-12-12
关于android连续点击出现多个Activity界面的解决方法
这篇文章主要介绍了关于android连续点击出现多个Activity界面的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-03-03
NestedScrollView+Recyclerview下滑卡顿解决方法
本文为大家解决安卓开发时候NestedScrollView+Recyclerview下滑卡顿的问题,希望能够帮助到你。2017-11-11


最新评论