使用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
相关推荐
Patrick在香港4 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术4 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫5 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话5 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠5 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个6 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
alexhilton6 小时前
Android XR 开发入门完全指南
android·kotlin·android jetpack
sunburn-7 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发8 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh9 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java