子线程中创建 handler导致okhttp请求失败,从 ScheduledExecutorService 挖的坑开始

子线程创建方法1:

                ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(2);
                schedulePool.schedule(new Runnable() {
                    @Override
                    public void run() {
                        dorequest();
                    }
                }, 2, TimeUnit.SECONDS);

子线程创建方法2:

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        dorequest();
                    }
                }).start();

dorequest 代码: 

   Log.e("aaaaa", "dorequest");

        Request request = new Request.Builder() .url("http://www.baidu.com").build();
        okhttp3.OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();

            
        // 导致请求停止的原因
        Handler h = new Handler();

        clientBuilder.build().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("aaaaa", "onFailure");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("aaaaa", "onResponse");

            }
        });


创建方法1 的运行结果:

方法运行中断,没有结果 。中断直接连网络请求都没有发出

创建方法2的运行结果:

直接crash,没有触发Looper.prepare()


问题的原因是在子线程中直接 new 了 handler 。如果不带 handler 时则正常。

由此有两种解决方案:

 方案一:补全 looper

private void dorequest(){
        Log.e("aaaaa", "dorequest");

        Request request = new Request.Builder() .url("http://www.baidu.com").build();
        okhttp3.OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();

        // 在new之前触发 prepare
        Looper.prepare();
        Handler h = new Handler();

        clientBuilder.build().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("aaaaa", "onFailure");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("aaaaa", "onResponse");

            }
        });

        // 在完成时要 loop
        Looper.loop();
    }

方案二:指定主线程中创建 handler

// 修改这一句即可
Handler h = new Handler(Looper.getMainLooper());


这次写这个不是因为 looper,而是因为 schedulePool 在没有处理 looper 时居然不报错,而是直接return了,正好碰到这个问题,发现 okhttp 没有实际请求,查半天才发现是这个漏处理了,所以记录一下。

ScheduledExecutorService

特别需要注意,一旦SES执行的逻辑中抛出异常,那么调度会自动停止,并且不会有任何提示信息。在其scheduleWithFixedDelay()和scheduleAtFixedRate()方法的JavaDoc中,都有这样的描述:

ScheduledExecutorService (Java Platform SE 8 )

If any execution of the task encounters an exception, subsequent executions are suppressed.

Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor.

同时,通过线程工厂ThreadFactory设置异常处理器UncaughtExceptionHandler是没有作用的,也就是说SES遇到异常时根本不会调用uncaughtException()方法。

具体错误捕获,请参见:

ScheduledExecutorService异常处理的正确姿势-CSDN博客

Java中的定时任务-ScheduledExecutorService的坑 | yilan 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

功能测试_验证新浪邮箱登录的正确性

案例:验证验证新浪邮箱登录的正确性 功能测试_等价类设计用例: 步骤: 1:明确需求:邮箱能否登录 2:划分等价类:有效等价类、有效取值、无效等价类、无效取值 3:提取数据编写用例:用例编号、…

带大家做一个,易上手的家常蒜蓉油麦菜

准备油麦菜 将最顶上 一点 和 根都去掉 然后 切成小段 时间足够 就用盐水用心清洗两遍 洗去表面的泥沙和虫卵 准备多一些蒜 切成碎末 起锅烧油 下蒜末 炒出蒜香味 然后 下入油麦菜翻炒 油麦菜会出水 等水烧的差不多 看油麦菜明显缩小后 下入小半勺盐 一点点白砂糖 翻炒均…

ssm041绿色农产品推广应用网站+vue

绿色农产品推广应用网站 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的…

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

Mysql底层原理六:InnoDB 数据页结构

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1)建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

基于Yolov5的检测系统实战

文章目录 一、数据集 二、网络结构 三、完整文件目录介绍 四、测试分析 一、数据集 1、数据格式:图像数据(JPG格式),采用labelme标注后的图像(XML格式),训练需要的TXT格式 2、数据来源&…

【Python数据分析】让工作自动化起来,无所不能的Python

这里写目录标题 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介前言读者对象如何阅读本书目录 前言 随着我国企业数字化和信息化的深入,企业对…

[CSS]布局

盒子就是把网站分割成一小块一小块的吧,然后方便移动或者管理 布局属性 所谓的布局就是依靠css布局让html元素,可以按照UI设计师提供的设计稿进行HTML网页的内容排版并实现页面的布局效果。 布局的学习关键就是:1. 布局方式,2. …

SpringBoot+Vue,轻松实现网页版人脸登录与精准识别

目录 1、技术介绍 2、技术原理 2.1、人脸检测 ①参考模板法 ②人脸规则法 2.2、人脸跟踪 2.3、人脸比对 ①特征向量法 ②面纹模板法 识别过程 案例 一、springboot后端项目 1,拉取项目后,导入相关依赖jar包 2,执行sql文件夹下面…

Qt 中的项目文件解析和命名规范

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:QT❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…

yuyv v4l2的数据转换成RGB

使用方法: 3840*2160是.yuv数据的分辨率 data.raw为yuv格式的raw数据 cv:显示 out.png 不显示,存储的文件名 python3 yuv_2_rgb.py data.raw cv 3840 2160或python3 yuv_2_rgb.py data.raw out.png 3840 2160 源码 yuv_2_rgb.py&#xff1…

antv X6离线文档部署 解决workspace configuration error问题

1.从github拉取源代码 x6开源库 下载至本地。 2.进入文件目录下 使用pnpm install 安装依赖 其中我遇到了两个问题 缺少python环境报错:解决如下: 安装python环境,将python加入系统环境变量path中 打开npm配置文件 编辑该文件加入python…

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步: IntelliJ IDEA 2024.1安装教程第 0 步&…

如何使用Tomcat+cpolar搭建本地站点并发布到公网分享好友远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器拥有强大功能,由于其可以实…

(二十七)Flask之数据库连接池DBUtils库

目录: 每篇前言:DBUtils库模式一(底层使用threading.local实现):模式二: Flask中使用方式一:直接将DBUtils初始化放到settings.py文件中方式二:从utils文件夹中导入 脚本使用DBUtils…

防止公司文件泄密的有效措施有哪些

防止公司文件泄密的有效措施有哪些 公司文件防止泄密是一项涉及多个层面和多种策略的综合性工作。以下列举了多种常用且有效的防止公司文件泄密的方式. 一、政策与流程制定 保密协议(NDA):要求员工、合作伙伴、供应商等签署保密协议&#x…

【计算机基础】期末考试必考,学会就能提高 40 分

二进制与十进制相互转换的详细过程及例题解析 二进制和十进制是两种常用的数制系统。二进制系统仅使用0和1两个数字,而十进制系统则使用0到9的十个数字。在计算机科学和数字电路设计等领域,经常需要在这两种数制之间进行转换。本文将详细介绍二进制与十…

【域适应】基于域分离网络的MNIST数据10分类典型方法实现

关于 大规模数据收集和注释的成本通常使得将机器学习算法应用于新任务或数据集变得异常昂贵。规避这一成本的一种方法是在合成数据上训练模型,其中自动提供注释。尽管它们很有吸引力,但此类模型通常无法从合成图像推广到真实图像,因此需要域…

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中,如果只是做一个简单的单元测试(不涉及端到端、数据库交互、API调用、消息队列处理等),我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…