使用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
相关推荐
rannn_1117 小时前
【Java项目】中北大学Java+数据库课设|校园食堂智能推荐与反馈系统
java·数据库·后端·课程设计·中北大学
似霰7 小时前
HIDL Hal 开发笔记10----添加硬件访问服务(Java 层调用 HIDL)
android·framework·hal
NE_STOP7 小时前
SpringBoot-shiro-jwt-dubbo-redis分布式统一权限系统(完结)
java
zfj3217 小时前
java函数式接口 @FunctionalInterface用法
java·函数·function
TracyCoder1237 小时前
并发编程(二):Java原子类(Atomic Classes)全解析
java·原子类·atomic
野犬寒鸦8 小时前
从零起步学习MySQL || 第十六章:MySQL 分库分表的考量策略
java·服务器·数据库·后端·mysql
木风小助理8 小时前
JavaAtomicInteger底层实现深度解析
java
BD_Marathon8 小时前
搭建MyBatis框架之创建MyBatis的映射文件(五)
java·数据库·mybatis
一只叫煤球的猫8 小时前
为什么Java里面,Service 层不直接返回 Result 对象?
java·spring boot·面试
洛阳泰山8 小时前
智能体项目MaxKB4J - 本地部署与开发完整指南
java·agent·工作流·rag·智能体·maxkb