一、前言
在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。这里记录一下使用google的guava库里面的ListenableFuture
并发类进行处理,CompletableFuture
也可以,只是在Android
上最低支持API23版本,但是项目最低支持21,使用coreLibraryDesugaring
进行兼容也处理不了这个问题,又因为项目中本身就有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>>() {
@Override
public void onSuccess(List<HourBean> result) {
if (!result.isEmpty()){
mAdapter.setDataList(result);
}
}
@Override
public void onFailure(@NonNull Throwable t) {
t.printStackTrace();
//失败的话就不处理了
}
},ContextCompat.getMainExecutor(getContext()));//传入主线程的线程池,后面会自动切换线程
}
@Override
protected 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;
}
@Override
public 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
- ListenableFuture,FutureCallback和超时
- Example usage for com.google.common.util.concurrent Futures withTimeout
- Google Guava 并发编程 - ListenableFuture
- Java并发编程——CompletableFuture类
- 深入解析CompletableFuture的功能和用法