91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-14 14:10:15 來源:腳本之家 閱讀:159 作者:湫水長天 欄目:移動開發

前言

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

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜章县| 张掖市| 厦门市| 四会市| 屏东县| 克什克腾旗| 措勤县| 黄平县| 岗巴县| 古丈县| 武夷山市| 依兰县| 呼玛县| 南投县| 贵德县| 尖扎县| 仁寿县| 阜城县| 西峡县| 中阳县| 张家界市| 商城县| 延边| 大港区| 浠水县| 班戈县| 榆社县| 方城县| 泽库县| 合阳县| 长乐市| 无棣县| 兴国县| 项城市| 静安区| 青田县| 临猗县| 稻城县| 安岳县| 华安县| 墨竹工卡县|