如何在WorkManager中處理異步任務(wù)詳解
前言
WorkManager 是 Android Jetpack 中的新組件,用于負(fù)責(zé)管理后臺任務(wù)。關(guān)于這個組件的介紹就不多說了,網(wǎng)上到處都是,這里分享一下在 WorkManager 中處理異步任務(wù)的方法。
我們知道,在 WorkManager 中,處理任務(wù)的方式是創(chuàng)建一個繼承自 Worker 的任務(wù)類,實現(xiàn) doWork() 方法,并在這個方法中實現(xiàn)我們自己的任務(wù),然后返回 Result.success() 或 Result.failure() 來表示任務(wù)執(zhí)行成功或者失敗。在這里, doWork() 方法中的任務(wù)應(yīng)該是同步的,這是很自然的,因為 doWork() 方法本身就是在子線程中執(zhí)行,因此可以在 doWork() 方法中同步執(zhí)行耗時操作。
但是些情況,我們想要執(zhí)行的是異步任務(wù),在 WorkManager 中,有兩種比較好的處理異步任務(wù)的方案。
RxWorker
很多時候我們會使用 RxJava 來處理數(shù)據(jù)。幸運的是,我們可以使用 RxWorker 來處理異步任務(wù)。
dependencies { ... implementation "android.arch.work:work-runtime:1.0.0-beta05" implementation "android.arch.work:work-rxjava2:1.0.0-beta05" }
然后,將之前集成 Work 的類改為繼承 RxWorker ,然后實現(xiàn) createWork() 方法,基本結(jié)構(gòu)如下:
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 { // 處理任務(wù) } }) .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() 方法默認(rèn)是在主線程中執(zhí)行的,如果 10 分鐘沒有結(jié)束任務(wù),就會自動取消。
ListenableWorker
當(dāng)我們?nèi)ゲ榭?RxWorker 的源碼時,就可以發(fā)現(xiàn)它是繼承了 ListenableWorker 類,其實 Worker 也是通過繼承 ListenableWorker 實現(xiàn)的。 因此,我們可以通過自定義 ListenableWorker 來實現(xiàn)相同的功能。
看一下 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() 里面先創(chuàng)建了 SettableFuture 對象,然后開了一個子線程,在子線程里面執(zhí)行 doWork() 方法,完了就使用 mFuture.set() 方法將 Result 返回。
因此我們也可以模仿 Worker 類的寫法,來實現(xiàn)自己的異步處理,簡單地模板代碼如下:
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; } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Flutter使用texture_rgba_renderer實現(xiàn)桌面端渲染視頻詳解
這篇文章主要為大家介紹了Flutter如何使用texture_rgba_renderer實現(xiàn)桌面端渲染視頻,文中的示例代碼講解詳細(xì),需要的可以了解一下2023-07-07Android開發(fā)中使用Intent打開第三方應(yīng)用及驗證可用性的方法詳解
這篇文章主要介紹了Android開發(fā)中使用Intent打開第三方應(yīng)用及驗證可用性的方法,結(jié)合實例形式分析了Android使用Intent打開第三方應(yīng)用的三種常用方式及使用注意事項,需要的朋友可以參考下2017-11-11Android中用StaticLayout實現(xiàn)文本繪制自動換行詳解
StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經(jīng)實現(xiàn)了文本繪制換行處理,下面這篇文章主要介紹了Android中用StaticLayout實現(xiàn)文本繪制自動換行的相關(guān)資料,需要的朋友可以參考。2017-03-03Android自定義實現(xiàn)BaseAdapter的優(yōu)化布局
這篇文章主要為大家詳細(xì)介紹了Android自定義實現(xiàn)BaseAdapter的優(yōu)化布局,感興趣的小伙伴們可以參考一下2016-08-08Android編程顯示網(wǎng)絡(luò)上的圖片實例詳解
這篇文章主要介紹了Android編程顯示網(wǎng)絡(luò)上的圖片,結(jié)合實例形式詳細(xì)分析了Android顯示網(wǎng)絡(luò)圖片的流程與具體操作技巧,需要的朋友可以參考下2016-10-10Kotlin ViewModelProvider.Factory的使用實例詳解
這篇文章主要介紹了Kotlin ViewModelProvider.Factory的使用,在我們使用 ViewModel 的時候,我們會發(fā)現(xiàn),有的時候我們需要用到 ViewModelFactory,有的時候不需要2023-02-02Android中Button實現(xiàn)點擊換圖案及顏色
大家好,本篇文章主要講的是Android中Button實現(xiàn)點擊換圖案及顏色,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01