使用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
相关推荐
qq_4419960522 分钟前
Mybatis官方生成器使用示例
java·mybatis
巨大八爪鱼28 分钟前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
大耳猫4 小时前
主动测量View的宽高
android·ui
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet