使用ListenableFuture进行异步任务执行并进行线程切换

文章目录

一、前言

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

三、参考链接

  1. 使用 ListenableFuture
  2. ContextCompat.getMainExecutor(@NonNull Context context)
  3. 【并发编程】Guava - ListenableFuture,避免Future获取阻塞问题,增加回调
  4. Guava-ListenableFuture
  5. 那些年我们追过的异步骚操作:ListenableFuture、CompletableFuture、RxJava(Observable)
  6. Java线程池详解:Future的使用和实现
  7. Java多线程之CompletableFuture
相关推荐
ArabySide几秒前
【Java Web】过滤器的核心原理、实现与执行顺序配置
java·spring boot·java-ee
稚辉君.MCA_P8_Java4 分钟前
Gemini永久会员 Java 返回最长有效子串长度
java·数据结构·后端·算法
zhimingwen12 分钟前
通过ADB获取Android应用的SHA1签名
android·adb
我超级能吃的13 分钟前
线程池核心原理及使用
java·开发语言
2501_9160074716 分钟前
深入理解 iOS 文件管理体系,从沙盒结构到多工具协同的工程化文件管理实践
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张16 分钟前
iOS 性能检测工具深度解析 多工具协同下的全维度性能检测体系建设
android·ios·小程序·https·uni-app·iphone·webview
路边草随风18 分钟前
java 实现 flink 读 kafka 写 delta
java·大数据·flink·kafka
逆风局?18 分钟前
后端Web实战(部门管理)——日志技术
java·前端
小马爱打代码22 分钟前
Spring AI:ChatClient实现对话效果
java·人工智能·spring
无敌最俊朗@27 分钟前
C++ 内存管理与编译原理 (面试复习2)
java·开发语言·jvm