使用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
相关推荐
应茶茶15 分钟前
C++11 核心新特性:从语法重构到工程化实践
java·开发语言·c++
消失的旧时光-194339 分钟前
Flutter 异步编程:Future 与 Stream 深度解析
android·前端·flutter
Reggie_L43 分钟前
RabbitMQ -- 高级特性
java·rabbitmq·java-rabbitmq
alexhilton2 小时前
Compose CameraX现已稳定:给Composer的端到端指南
android·kotlin·android jetpack
lang201509282 小时前
Spring空安全指南:告别空指针异常
java·安全·spring
学到头秃的suhian2 小时前
Java内存区域
java·jvm
栗子飞啊飞2 小时前
如何实现大模型 “边生成边显示“
java·deepseek
一介书生-0072 小时前
2025-10-27 Java AI学习路线
java·人工智能·学习
py有趣3 小时前
LeetCode算法学习之移除元素
java·数据结构·算法