文章目录
- 一、前言
- 二、关键代码
- 三、参考链接
一、前言
在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。这里记录一下使用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