如何在WorkManager中处理异步任务详解
前言
WorkManager是AndroidJetpack中的新组件,用于负责管理后台任务。关于这个组件的介绍就不多说了,网上到处都是,这里分享一下在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()方法,基本结构如下:
publicclassAsyncWorkerextendsRxWorker{ publicAsyncWorker(ContextappContext,WorkerParametersworkerParams){ super(appContext,workerParams); } @Override publicSinglecreateWork(){ returnremoteService.getMySingleResponse() .doOnSuccess(newConsumer(){ @Override publicvoidaccept(Objectobject)throwsException{ //处理任务 } }) .map(newFunction(){ @Override publicObjectapply(Objectobject)throwsException{ returnResult.success(); } }) .onErrorReturn(newFunction(){ @Override publicObjectapply(Objectobject)throwsException{ returnResult.failure(); } }); } }
很简单是吧?有一点要注意的是,createWork()方法默认是在主线程中执行的,如果10分钟没有结束任务,就会自动取消。
ListenableWorker
当我们去查看RxWorker的源码时,就可以发现它是继承了ListenableWorker类,其实Worker也是通过继承ListenableWorker实现的。因此,我们可以通过自定义ListenableWorker来实现相同的功能。
看一下Worker的源码,很简单:
publicabstractclassWorkerextendsListenableWorker{ SettableFuturemFuture; publicWorker(@NonNullContextcontext,@NonNullWorkerParametersworkerParams){ super(context,workerParams); } @WorkerThread publicabstract@NonNullResultdoWork(); @Override publicfinal@NonNullListenableFuture startWork(){ mFuture=SettableFuture.create(); getBackgroundExecutor().execute(newRunnable(){ @Override publicvoidrun(){ Resultresult=doWork(); mFuture.set(result); } }); returnmFuture; } }
可以里面主要使用了SettableFuture这个类,在startWork()里面先创建了SettableFuture对象,然后开了一个子线程,在子线程里面执行doWork()方法,完了就使用mFuture.set()方法将Result返回。
因此我们也可以模仿Worker类的写法,来实现自己的异步处理,简单地模板代码如下:
publicclassAsyncWorkerextendsListenableWorker{ privateSettableFuturemFuture; publicAsyncWorker(ContextappContext,WorkerParametersworkerParams){ super(appContext,workerParams); } @Override publicListenableFuture startWork(){ mFuture=SettableFuture.create(); doSomeAsyncWork(newAsyncListener(){ @Override publicvoidsuccess(){ mFuture.set(Result.success()); } @Override publicvoidfail(){ mFuture.set(Result.failure()); } }); returnmFuture; } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。