a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統 > Android > 正文

如何在WorkManager中處理異步任務詳解

2019-10-21 21:25:24
字體:
來源:轉載
供稿:網友

前言

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; }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩国产高清视频 | 国产成人在线播放 | 一区二区中文 | 99久久99久久精品国产片果冻 | 成人免费一区二区三区视频网站 | 成人日批视频 | 日韩中文在线播放 | 国产高清视频 | 欧美男人天堂网 | 国内自拍视频在线观看 | 七龙珠z普通话国语版在线观看 | av黄色在线观看 | 日韩三级在线播放 | 在线视频成人永久免费 | 中文字幕国产在线观看 | 久久久成人精品 | 一区二区三区在线 | 91精品国产乱码久久久久久 | 久久久久国产 | 久草视频在线播放 | 国产高潮呻吟久久渣男片 | 精品亚洲永久免费精品 | 中文字幕一区在线观看 | 成人免费看 | 日本一区二区三区四区视频 | 欧美一区二区三区视频在线观看 | 精品久久久一区二区 | 亚洲激情视频在线观看 | 久久密| 欧美一区二区三区在线看 | 日本xxxxx片免费观看19 | 一区二区三区视频在线观看 | 国产精品一区二区无线 | 亚洲久草 | 日韩在线播放一区 | 国产一级片 | 久久久高清视频 | 免费毛片一区二区三区久久久 | 国产精品99久久 | 九九精品免费 | 亚洲午夜精品一区二区三区 |