文章目錄
- 一、前言
- 二、關鍵代碼
- 三、參考鏈接
一、前言
在程序中會經常需要做一些異步任務,但是由于部分操作其實很簡單,僅僅是短暫的進行異步操作,然后在結果成功或失敗的時候切換回主線程進行下一步處理,這期間不能阻塞主線程。這里記錄一下使用google的guava庫里面的ListenableFuture
并發類進行處理,CompletableFuture
也可以,只是在Android
上最低支持API23版本,但是項目最低支持21。使用coreLibraryDesugaring
來進行Java高版本兼容的話,改動比較多,一直有R8/D8
兼容性錯誤。估計要升級jdk、gradle等等版本,在協作開發中不太合適,項目中本身就有guava
。所以使用這個進行開發。Android自身的話可以使用Loader
或者Work
進行加載,Loader
的寫法相對來說會簡單一些
二、關鍵代碼
private final ListeningExecutorService listeningExecutor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
/*** 設置展示的信息*/public void setDisplayDataInfo(Weather.WeatherResponse dataInfo, Activity activity) {this.mActivity = activity;ParseHourDataCallable parseHourDataCallable = new ParseHourDataCallable(dataInfo);ListenableFuture<List<HourBean>> weaHourliesFuture = listeningExecutor.submit(parseHourDataCallable);Futures.addCallback(weaHourliesFuture, new FutureCallback<List<HourBean>>() {@Overridepublic void onSuccess(List<HourBean> result) {if (!result.isEmpty()){mAdapter.setDataList(result);}}@Overridepublic void onFailure(@NonNull Throwable t) {t.printStackTrace();//失敗的話就不處理了}},ContextCompat.getMainExecutor(getContext()));//傳入主線程的線程池,后面會自動切換線程}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();listeningExecutor.shutdown();}private class ParseHourDataCallable implements Callable<List<HourBean>>{private final Weather.WeatherResponse dataInfo;public ParseHourDataCallable(Weather.WeatherResponse dataInfo) {this.dataInfo = dataInfo;}@Overridepublic List<HourBean> call() throws Exception {//這里進行耗時操作List<HourBean> hours = new ArrayList<>();if (dataInfo != null && dataInfo.weaHourlies != null && dataInfo.weaHourlies.length > 0) {hours = parserData(Arrays.asList(dataInfo.weaHourlies),dataInfo.timezone ,dataInfo.sunrises[0]);}return hours;}}
整體用法的話和CompletableFuture
差不多
三、參考鏈接
- 使用 ListenableFuture
- ContextCompat.getMainExecutor(@NonNull Context context)
- 【并發編程】Guava - ListenableFuture,避免Future獲取阻塞問題,增加回調
- Guava-ListenableFuture
- 那些年我們追過的異步騷操作:ListenableFuture、CompletableFuture、RxJava(Observable)
- Java線程池詳解:Future的使用和實現
- Java多線程之CompletableFuture