如何在WorkManager中處理異步任務詳解
前言
WorkManager 是 Android Jetpack 中的新組件,用于負責管理后臺任務。關于這個組件的介紹就不多說了,網(wǎng)上到處都是,這里分享一下在 WorkManager 中處理異步任務的方法。
我們知道,在 WorkManager 中,處理任務的方式是創(chuàng)建一個繼承自 Worker 的任務類,實現(xiàn) doWork() 方法,并在這個方法中實現(xiàn)我們自己的任務,然后返回 Result.success() 或 Result.failure() 來表示任務執(zhí)行成功或者失敗。在這里, doWork() 方法中的任務應該是同步的,這是很自然的,因為 doWork() 方法本身就是在子線程中執(zhí)行,因此可以在 doWork() 方法中同步執(zhí)行耗時操作。
但是些情況,我們想要執(zhí)行的是異步任務,在 WorkManager 中,有兩種比較好的處理異步任務的方案。
RxWorker
很多時候我們會使用 RxJava 來處理數(shù)據(jù)。幸運的是,我們可以使用 RxWorker 來處理異步任務。
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() 方法,基本結構如下:
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() 方法默認是在主線程中執(zhí)行的,如果 10 分鐘沒有結束任務,就會自動取消。
ListenableWorker
當我們?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;
}
}
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
android音樂播放簡單實現(xiàn)的簡單示例(MediaPlayer)
本篇文章主要介紹了android音樂播放簡單實現(xiàn)的簡單示例(MediaPlayer),具有一定的參考價值,有興趣的可以了解一下2017-08-08
Android開發(fā)使用RecyclerView添加點擊事件實例詳解
這篇文章主要為大家介紹了Android開發(fā)使用RecyclerView添加點擊事件實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Flutter開發(fā)之支持放大鏡的輸入框功能實現(xiàn)
在Flutter開發(fā)時,有時為了優(yōu)化用戶輸入體驗,往往會需要輸入框支持在移動光標過程中可以出現(xiàn)放大鏡功能。本文將為大家介紹實現(xiàn)的方法,需要的可以參考一下2022-02-02
淺析AndroidStudio3.0最新 Android Profiler分析器(cpu memory network
Android Profiler分為三大模塊: cpu、內(nèi)存 、網(wǎng)絡。本文給大家介紹AndroidStudio3.0最新 Android Profiler分析器(cpu memory network 分析器)的相關知識,他們的基本使用方法,在文中都給大家提到,具體內(nèi)容詳情大家通過本文一起學習吧2017-12-12
關于android連續(xù)點擊出現(xiàn)多個Activity界面的解決方法
這篇文章主要介紹了關于android連續(xù)點擊出現(xiàn)多個Activity界面的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Kotlin Service實現(xiàn)消息推送通知過程
這幾天分析了一下的啟動過程,于是乎,今天寫一下Service使用; 給我的感覺是它并不復雜,千萬不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個接著一個,就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口2022-12-12
NestedScrollView+Recyclerview下滑卡頓解決方法
本文為大家解決安卓開發(fā)時候NestedScrollView+Recyclerview下滑卡頓的問題,希望能夠幫助到你。2017-11-11

