首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我使用带有"enqueue“的okhttp时,我得到了android.os.NetworkOnMainThreadException。

当您在使用带有"enqueue"的OkHttp时,如果您在主线程上执行网络请求,就会出现android.os.NetworkOnMainThreadException异常。这是因为在Android平台上,主线程是用于处理用户界面的,如果在主线程上执行耗时的网络请求,会导致界面卡顿甚至无响应。

为了解决这个问题,您可以将网络请求放在后台线程中执行。以下是一种常见的解决方案:

  1. 创建一个后台线程来执行网络请求。您可以使用Java中的Thread类或者Android中的AsyncTask类来实现。
  2. 在后台线程中使用OkHttp的enqueue方法来执行网络请求。enqueue方法是异步执行的,它会在后台线程中执行网络请求,并在请求完成后通过回调方法返回结果。
  3. 在回调方法中处理网络请求的结果。您可以在回调方法中更新UI或者进行其他操作。

下面是一个示例代码:

代码语言:txt
复制
new Thread(new Runnable() {
    @Override
    public void run() {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://example.com")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 处理请求失败的情况
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 处理请求成功的情况
            }
        });
    }
}).start();

在上面的示例中,我们创建了一个新的后台线程,并在该线程中执行网络请求。在enqueue方法的回调方法中,您可以处理请求成功或失败的情况。

关于OkHttp的更多信息和使用方法,您可以参考腾讯云的相关产品文档:OkHttp产品介绍

请注意,以上答案仅供参考,具体的实现方式可能因您的具体需求和环境而有所不同。

相关搜索:当我测试我的rails应用的模型时,我得到了错误当我使用"sawtooth“命令时,我得到了一个错误当我尝试标注我的地块时,我得到了这个类型错误当我使用ITelephony时,我得到了此getITelephony方法未找到的错误当我使用lerna运行serve命令时,我得到了大量的输出行我正在用邮递员敲击api,当我使用curl时,我得到了响应,我得到了空响应当我尝试使用excel数据时,我得到了java.lang.ExceptionInInitializerError?当我运行下面提到的代码时,我得到了这个错误当我尝试运行我的angular项目时,我得到了以下错误我使用带有freemarker模板的Gson。当我尝试检查一个数组对象为空时,我得到了错误当我尝试更新我的数据时,我遇到了laravel验证逻辑的问题。当我尝试使用npm安装brain.js时,我得到了这个错误当我使用带有spark/scala的窗口时,我不能改变分区吗?当我使用JSON.parse时,我得到了"SyntaxError:意外的令牌‘in JSON at position 1“当我按下我的微调器时,我看到了我的数据,但当我试图选择它时,它没有设置数据?当我的登录页面连接到MySql时,我得到了错误的CommunicationException我使用pip安装了pandas,但是当我尝试运行它时,我得到了ModuleNotFoundError为什么当我使用分数时,我得到了[LayoutConstraints]错误。但当我舍入这个数字时。错误消失了我注册时遇到了使用改装的问题我正在使用django版本3,当我尝试使用模型管理器时,我得到了这个错误
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android网络编程(十一)源码解析Retrofit

前言 最近博客产出确实很少,因为博主正在写一本Android进阶书籍,两头很难兼顾,但是每个月也至少发一篇博客。...上一篇我们介绍了Retrofit使用方法,这一篇我们照例来学习Retrofit源码。 1.Retrofit创建过程 当我使用Retrofit请求网络,首先要写请求接口: ?...当我们得到Call对象后会调用它enqueue方法,其实调用是ExecutorCallbackCallenqueue方法,而从注释1处可以看出ExecutorCallbackCallenqueue...3.Callenqueue方法 接下来我们就来查看OkHttpCallenqueue方法,代码如下所示。 ? 注释1处调用了okhttp3.Callenqueue方法。...Callenqueue方法主要做就是用OKHttp来请求网络并将返回Response进行数据转换并回调给UI线程。 至此,Retrofit源码就讲到这里。

89370

Android网络编程(七)源码解析OkHttp前篇

前言 学会了OkHttp3用法后,我们当然有必要来了解下OkHttp3源码,当然现在网上文章很多,仍旧希望这一系列文章篇是最简洁易懂。...1.从请求处理开始分析 首先OKHttp3如何使用这里就不在赘述了,不明白同学可以查看Android网络编程(五)OkHttp用法全解析和Android网络编程(六)OkHttp3用法全解析这两篇文章...当我们要请求网络时候我们需要用OkHttpClient.newCall(request)进行execute或者enqueue操作,当我们调用newCall: ?...实际返回是一个RealCall类,我们调用enqueue异步请求网络实际上是调用了RealCallenqueue方法: ? 可以看到最终请求是dispatcher来完成。...都为null情况也就是不进行网络请求并且缓存不存在或者过期,这时候则返回504错误;当networkRequest 为null也就是不进行网络请求,而且缓存可以使用时则直接返回缓存;其他情况则请求网络

88490
  • Android技能树 — 网络小结之 OkHttp超超超超超超超详细解析

    我们知道在使用okhttp时候可以使用同步请求,也可以使用异步请求,所以肯定不同请求,在分发时候有不同处理。...参考文章: 教你如何使用okhttp缓存 OKHTTP之缓存配置详解 InternalCache:Okhttp内部缓存接口,我们直接使用时候不需要去实现这个接口,而是直接去使用上面的Cache...当你构建一请求使用RequestBuilder.tag(tag)来分配一个标签。 之后你就可以用OkHttpClient.cancel(tag)来取消所有带有这个tagcall。....所以后面call.execute()/call.enqueue()都是执行RealCall相对应方法。但目前位置我们上面的图已经讲解好了,这里再贴一次: ?...简单分析 4.6 自定义拦截器 我们在流程图中看到了,除了OKHttp源码里面自带拦截器,还有二种自定义拦截器,应用拦截器和网络拦截器。

    91610

    Android车轮之网络数据读取框架OkHttp

    +被废弃啦,而目前OkHttp技术已经比较成熟,可以这么说:为了让您应用运行更快、更高效、更节省流量,那么OkHttp库就是为此而生。...---- ****项目添加OkHttp框架**** 最新版本为:okhttp-3.2.0.jar 、okio-1.7.0.jar | OkHttp框架Github 注意:使用OkHttp框架必须导入这两个库...,OkHttp库要依赖okio库 ---- 更新说明 2016..5.23 增加OkHttp原生方法 以Request作为参数请求 使用方法 //原生OkHttp方法 参数 Request request...没回调 OkHttpManager.enqueue(request); //原生OkHttp方法 异步请求 有回调 OkHttpManager.enqueue(request, new Callback...**** 在此就不必啰嗦啦 - 官方API 为了更方便学习与使用此框架,就花费了点时间封装成了一个工具类 //GET 同步 返回Response Response response = OkHttpManager.executeSync

    64650

    源码解析: Retrofit2.5

    .今天就带大家来看一下Retrofit究竟是如何使用,以及内部工作原理 一.概述 作用   OKHttp更加简洁,更加方便,同时影藏了oKHttp某些功能。...使用 Call.execute() 或者 Call.enqueue() 来发起请求 repos.enqueue(new Callback>() {...继续往回看,找呀找, 找到了Retrofit初始化方法 create,整个源码就不翻出来了,翻一翻关键部分,其中需要讲述APi有: eagerlyValidateMethods newProxyInstance...HttpServiceMethod.java, ctr + f 搜,便搜到了invoke,原来底层真是通过OKHttp实现: final class HttpServiceMethod<ResponseT...动态代理模式 通过动态代理方式,当调用Retrofitcreate()方法,会进行动态代理监听。当执行具体接口方法,会回调InvocationHandler。

    78300

    深入浅出Retrofit2.x(一)

    Square 公司开源 okhttp,一okhttp 风靡整个开发圈,进而衍生了好多大牛对 okhttp 封装开源库,像鸿洋大神封装 okhttputils,还有 Okgo … 然后就是...create() 方法,方法参数就是我们定义接口 class,create 内部实现是使用了 Java 中动态代理模式,考虑到一些基础比较差同学,关于动态代理,这里简单解释一下:代理类在程序运行时创建代理方式被成为动态代理...,代理类并不是在Java代码中定义,而是在运行时在 Java 代码中动态生成当我使用代理对象执行代理对象方法,都会被替换成执行invoke方法,在 invoke 方法中可以拿到代理对象,代理对象方法及参数...值,这样就达到了动态替换效果,好了我们又学会了使用 @Path 注解了,好棒棒!...不过在使用 @Path 注解应该注意一下几点: 使用@Path,Path对应路径不能包含”/”,否则会将其转化为 %2F,在遇到想动态拼接多节url,还是使用@Url; @Path只是用来做一层路径

    78010

    「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    对于 JSON ,通常使用Gson ,但是可以添加自定义转换器来处理 XML 或其他协议。Retrofit 对 HTTP 请求使用 OkHttp 库。...首先你先将要发送表单信息封装为 Post 请求 Body 对象,那么有的同学会问什么是 POST ,什么是 Body?...里参数我们发现,这与 okHttp 创建 FormBody ,add 参数不谋而合 看到这里想必大家都明白了,如果大家还不明白什么是 Get 请求,以及 @Query("…") 里 username...,比如网速慢,手机会卡在那动不了甚至 ANR ) 这里介绍下异步请求: // 回调 call.enqueue(new Callback() { @Override...} }); 这就是异步方法,直接调用 call enqueue 方法,传入一个 Callback 接口即可 调用后系统自动释放资源,不会阻塞,等到请求结果返回 就会自动调用 onResponse

    1.2K30

    Android中Retrofit 2.0直接使用JSON进行数据交互

    之前使用Retrofit都是将JSON串转化为POJO对象,针对不同业务协议,定义相应接口和参数列表。...must end in / 当我们需要完整指定URL时候,特别是上面列出第二种GET方式,我们URL是http://112.124.22.238:8081/course_api/wares/...pageSize=1&curPage=1/ 一开始遇到这个问题时候也是第一反应去查Retrofit官方文档和说明,或者让第三方开发人员采用第二种GET请求方式,用一个以 / 结尾URL,然后把...后面带那些值放到一个Map里传进来。首先官方说明和Api用法没找到,而且这个baseUrl还必须调用,其次,别的开发人员不愿意弄,好好辛辛苦苦把URL都组装好了,没啥事让传Map啊,肯定也不行。...剩下就是回调和消息组装了,各位可以根据自己业务需求进行组装和调整,这里就只贴出代码不做过多解析了。

    3.3K21

    从设计模式看OkHttp源码

    所以今天准备从设计模式角度再来读一遍 OkHttp源码。...主要内容就分为两类: OkHttp基本运作流程 涉及到设计模式 (本文源码版本为okhttp:4.9.0,拦截器会放到下期再讲) 使用 读源码,首先就要从它使用方法开始: val okHttpClient...string()) } }) 从这个使用方法来看,抽出了四个重要信息: okHttpClient Request newCall(request) enqueue(Callback...那这种定义了统一创建对象接口,然后由子类来决定实例化这个对象设计模式就是 工厂模式。 在工厂模式中,我们在创建对象不会对客户端暴露创建逻辑,并且是通过使用一个共同接口来指向新创建对象。...enqueue(Callback) 接下来这个方法enqueue,肯定就是okhttp源码重中之重了,刚才说到newCall方法其实是获取了RealCall对象,所以就走到了RealCallenqueue

    77630

    Android常用库源码解析

    DiskCache图片磁盘缓存,默认使用LruDiskCache算法,在缓存满删除最近最少使用图片 glide源码 一般看源码先看他使用方法,通过使用方法看对应代码。...Volley停止了更新,而OkHttp到了官方认可,并在不断优化。...因此最终替换为了OkHttp volley原理 主线程中调用RequestQueueadd()方法来添加一条网络请求,这条请求会先被加入到缓存队列当中,如果发现可以找到相应缓存结果就直接读取缓存并解析...然后当我们主动发起网络请求时候会调用okhttp发起网络请求,okhttp配置包括请求方式,URL等。...所有就要使用线程池,例如newFixdThreadPool 可以控制并发数量,且在整个APP运行过程中有几个常驻线程在,避免使用时反复地new,退出再销毁,而 newCacheThreadPool 则会在任务完成后

    1.1K10

    Android开发之OkHttp介绍

    ,而市面上流行Retrofit同样是使用OkHttp进行再次封装而来。...由此可见OkHttp有多强大了。 下面来简单介绍一下OkHttp: HTTP是现代应用常用一种交换数据和媒体网络方式,高效地使用HTTP能让资源加载更快,节省带宽。...,避免一些完全重复请求 当网络出现问题时候OkHttp依然坚守自己职责,它会自动恢复一般连接问题,如果你服务有多个IP地址,当第一个IP请求失败OkHttp会交替尝试你配置其他IP,OkHttp...要想使用OkHttp先配置gradle环境,也可以下载jar包然后添加到自己项目 下面来具体使用一下OkHttp 首先绘制布局,这里简单绘制一下,布局里添加了一个按钮和一个可以滚动文本框 <...前提是你控件必须有id,没有id值是无法自动生成代码。 说了这么多,怎么感觉跑题了,请原谅迫切想与大家分享插件心,回归正题。

    79010

    一步步带你读懂 Okhttp 源码

    到目前为止,他最新版本是 4.1.0, 使用 kotlin 语言写,由于本人对 kotlin 语言不是很熟悉,这篇文章已 3.5.0 版本为基础进行分析。...简介 Rxjava+Okhttp+Refrofit 如今已经成为项目网络请求首选,在讲解原理之前,我们先来看一下 Okhttp 基本使用。...使用 OkHttp 基本是以下四步: 创建 OkHttpClient 对象 创建Request请求对象 创建Call对象 同步请求调用call.execute();异步请求调用call.enqueue(...,当执行 run 方法,会执行 execute 方法。...到此, Okhttp 主要流程已经讲完 ---- 小结 有一个分发器 Dispatcher,里面有三个请求队列,一个是正在请求队列,一个是等待队列,另外一个是同步正在请求队列,当我们执行 enqueue

    80730

    OkHttp科普篇

    OkHttp科普篇 原文作者:星宸2021 原文链接:https://juejin.cn/post/7000360176834330638 本文目的 1.梳理okhttp整体流程 2.Java和kotlin...要求在Android5.0以上版本上且jdk版本为jdk8 使用流程 引入依赖 //新版库采用kotlin语言编写 implementation("com.squareup.okhttp3:okhttp...当获取到响应时候,又会把响应缓存到磁盘上面 ConnectionInterceptor:连接拦截器 1.判断当前连接是否可以使用:流是否已经被关闭,并且已经被限制创建新流; 2.如果当前连接无法使用...在 ConnectionPool 中,当我们向连接池中缓存一个连接时候,只要调用双端队列 add() 方法,将其加入到双端队列即可,而清理连接缓存操作则交给线程池来定时执行 kotlin版本 object...,kotlin中用带有原子性属性值并且是通过CAS操作呢?

    89810

    OKHttp源码解析--初阶

    : 1、OkHttp介绍 2、OkHttp使用 3、OkHttp流程源码跟踪 一、OKHTTP简介 1.支持HTTP2/SPDY 2.socket自动选择最好路线,并支持自动重连 3.拥有自动维护...socket连接池,减少握手次数 4.拥有队列线程池,轻松写并发 5.拥有Interceptors轻松处理请求与响应(比如透明GZIP压缩)基于Headers缓存策略 二、OKHTTP使用 1、GET...所以RealCall可以很方便地使用这两个对象。 2、RealCall里面的两个关键方法是:execute 和 enqueue。分别用于同步和异步执行网络请求。...由从上文可知,如果没有开发者自定义Interceptor,首先调用RetryAndFollowUpInterceptor,如果有开发者自己定义interceptor则调用开发者interceptor...所以我们得到了OKHTTP大体流程,如下图: ? 四、OKHTTP类详解 大体核心类主要下图: ? 最后给大家看一下整体流程图 ?

    90320

    由浅入深,聊聊OkHttp那些事

    引言 在 Android 开发世界中,有一些组件,无论应用层技术再怎么迭代,作为基础支持,它们依然在那里。 比如当我们提到网络库,总会下意识想到一个名字,即 OkHttp 。...图片 当我使用 OkHttpClient.newCall() 方法,实际是创建了一个新 RealCall 对象,用于 应用层与网络层之间桥梁,用于处理连接、请求、响应以及流 ,其默认构造函数中需要传递...--- enqueue() 执行 异步请求 时调用,具体源码如下: client.newCall(request).enqueue(CallBack) 图片 当我们调用 RealCall.enqueue...--- 责任链模式 在上面我们说到了,要解释 OkHttp 拦截器链,我们有必要简单聊一下什么是责任链模式?...OkHttp 源码分析 关于我 是 Petterp ,一个 Android工程师

    1.3K40

    OKHttp源码解析(一)--初阶

    * 本篇文章 主要讲解OKHttp源码解析(3.7.0) OKHttp官网 github地址 本篇文章主要内容如下: OkHttp介绍 OkHttp使用 OkHttp流程源码跟踪 一、OKHTTP...轻松处理请求与响应(比如透明GZIP压缩)基于Headers缓存策略 二、OKHTTP使用: 1、GET请求 OkHttpClient client = new OkHttpClient();...所以RealCall可以很方便地使用这两个对象。 2、RealCall里面的两个关键方法是:execute 和 enqueue。分别用于同步和异步执行网络请求。...由从上文可知,如果没有开发者自定义Interceptor,首先调用RetryAndFollowUpInterceptor,如果有开发者自己定义interceptor则调用开发者interceptor...所以我们得到了OKHTTP大体流程,如下图: ? OKHTTP大体流程.png 三、OKHTTP类详解 大体核心类主要下图: ? 核心类.png 最后给大家看一下整体流程图 ? 流程.png

    1.6K41
    领券