文章目录
一、前言
在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。这里记录一下使用google的guava库里面的ListenableFuture
并发类进行处理,CompletableFuture
也可以,只是在Android
上最低支持API23版本,但是项目最低支持21。使用coreLibraryDesugaring
来进行Java高版本兼容的话,改动比较多,一直有R8/D8
兼容性错误。估计要升级jdk、gradle等等版本,在协作开发中不太合适,项目中本身就有guava
。所以使用这个进行开发。Android自身的话可以使用Loader
或者Work
进行加载,Loader
的写法相对来说会简单一些
二、关键代码
java
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
差不多