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

Android:在新线程中使用retrofit时会发生NetworkOnMainThreadException?

Android中的NetworkOnMainThreadException异常是指在主线程中进行了网络请求操作,违反了Android的主线程不允许进行耗时操作的规定。为了避免阻塞主线程,Android引入了异步任务(AsyncTask)的概念,用于在后台线程执行耗时操作。

在使用Retrofit进行网络请求时,如果在主线程中执行网络请求操作,就会抛出NetworkOnMainThreadException异常。这是因为网络请求是一个耗时操作,如果在主线程中执行,会导致主线程被阻塞,影响用户界面的响应和流畅性。

为了解决这个问题,可以使用以下两种方法:

  1. 使用异步任务(AsyncTask):将网络请求操作放在异步任务的doInBackground()方法中执行,这样可以在后台线程中执行网络请求,避免阻塞主线程。在异步任务的onPostExecute()方法中可以处理网络请求的结果,并更新UI。
  2. 使用线程(Thread)或线程池:创建一个新的线程或使用线程池,在新线程中执行网络请求操作。可以使用Java的Thread类或线程池Executor来实现。需要注意的是,在新线程中执行网络请求后,如果需要更新UI,需要通过Handler或runOnUiThread()方法切换回主线程。

推荐的腾讯云相关产品:腾讯云移动直播(https://cloud.tencent.com/product/mlvb)可以用于实时音视频直播场景,提供了丰富的功能和接口,方便开发者快速搭建移动直播应用。

总结:在Android开发中,为了避免NetworkOnMainThreadException异常,需要将网络请求操作放在异步任务或新线程中执行。这样可以保证主线程的流畅性,并提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【译】Retrofit 2 - 如何从服务器下载文件

小鄧子 状态: 完成 如何声明Retrofit请求 如果你阅读本文前没有写过任何一行Retrofit请求代码,那么最好看一下前面几篇博客。...Retrofit会试图解析并转换它,所以你不能使用任何其他返回类型,否则当你下载文件的时候,是毫无意义的。 第二种方案是Retrofit 2的特性。现在你可以轻松构造一个动态地址来作为全路径请求。...当心大文件:请使用@Streaming! 如果下载一个非常大的文件,Retrofit会试图将整个文件读进内存。为了避免这种现象的发生,我们添加了一个特殊的注解来声明请求。...值得注意的是,如果你使用了@Streaming,并且依然使用以上的代码片段来进行处理。Android将会抛出android.os.NetworkOnMainThreadException异常。...因此,最后一步就是把这些操作放进一个单独的工作线程,例如ASyncTask: final FileDownloadService downloadService =

2.2K10

Android编程实现使用handler线程更新UI示例

本文实例讲述了Android编程实现使用handler线程更新UI。...; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView...<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com.../ </RelativeLayout 更多关于Android相关内容感兴趣的读者可查看本站专题:《Android线程与消息机制用法总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总...》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》 希望本文所述对大家Android程序设计有所帮助

1.7K51

啰嗦一下androidNetworkOnMainThreadException

相信很多Android开发者很多都遇到过android.os.NetworkOnMainThreadException 这个异常,意思就是主线程进行网络操作异常。...严格模式 早期的Android版本(2.3之前),Google并没有提供一个很严格的程序编写要求,所以在那时我们可以线程执行本地IO操作,网络操作等这些不规范的行为。...android.os.NetworkOnMainThreadException这个异常从Android 3.0(API 11)引入,出现情况为主线程进行网络操作。...但是这并没有改变真正解决问题,主线程照样还是有网络操作,可能导致程序出现未响应的情况。所以这是一个很糟糕的解决方法,问题的解决思路应该是将网络操作移到非主线程进行,而不是这种掩耳盗铃的做法。...AsyncTask可以将网络操作移到了AsyncTask的线程,可以避免NetworkOnMainThreadException异常。

2K20

2019最新Android面试题「建议收藏」

例如:浏览器主界面 ④.singleInstance模式 特点:该模式的Activity会启动一个的任务栈来管理Activity实例,并且该势力整个系统只有一个。...主要作用是为了不同程序中共享一个Activity 6.Touch事件传递机制 我们点击屏幕时,会有下列事件发生: Activity调用dispathTouchEvent()方法,把事件传递给Window...,生面周期的变化(这个偶尔会问) 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 设置Activity的android...② 支持优先级处理 ③ 支持延迟到图片尺寸计算完成加载 ④ 支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。 ⑤ “无”本地缓存。...所以这两个库相比,Retrofit更有优势,能掌握两个框架的前提下该优先使用 Retrofit

83520

2019最新Android面试题

例如:浏览器主界面 ④.singleInstance模式 特点:该模式的Activity会启动一个的任务栈来管理Activity实例,并且该势力整个系统只有一个。...主要作用是为了不同程序中共享一个Activity 6.Touch事件传递机制 我们点击屏幕时,会有下列事件发生: Activity调用dispathTouchEvent()方法,把事件传递给Window...,生面周期的变化(这个偶尔会问) 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 设置Activity的android...② 支持优先级处理 ③ 支持延迟到图片尺寸计算完成加载 ④ 支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。 ⑤ “无”本地缓存。...所以这两个库相比,Retrofit更有优势,能掌握两个框架的前提下该优先使用 Retrofit

96620

Carson带你学Android:RxJava线程控制(含实例讲解)

线程被创建,那么他们的工作(生产事件 / 接收& 响应事件)就会发生在主线程 因为创建被观察者 (Observable) / 观察者(Observer)的线程 = 主线程 所以生产事件 / 接收&...响应事件都发生在主线程 下面请看1个RxJava的基础使用 public class MainActivity extends AppCompatActivity { private static...;然后回到主线程实现 UI操作 应用到 RxJava模型,可理解为: 被观察者 (Observable) 线程 中生产事件(如实现耗时操作等等) 观察者(Observer)线程 接收...3.2 具体使用 具体是 (上述步骤3)通过订阅(subscribe)连接观察者和被观察者实现 // Observable.subscribeOn(Schedulers.Thread... Gradle加入Retrofit库的依赖 build.gradle dependencies { // Android 支持 Rxjava // 此处一定要注意使用RxJava2的版本 compile

76420

今日头条面试

关于ACTION_CANCEL何时被触发,系统文档有这么一种使用场景:设计设置页面的滑动开关时,如果不监听ACTION_CANCEL,滑动到中间时,如果你手指上下移动,就是移动到开关控件之外,则此时会触发...通过创建新线程的方式。真正会卡死主线程的操作是回调方法onCreate/onStart/onResume等操作时间过长,会导致掉帧,甚至发生ANR,looper.loop本身不会导致应用卡死。...Android面试之主流框架 Android面试的时候,经常会被问到一些Android开发中用到的一些开发框架,如常见的网络请求框架Retrofit/OkHttp,组件通信框架EventBus/Dagger2...Retrofit的动态代理 Retrofit使用了动态代理是不错,但是并不是为了真正的代理才使用的,它只是为了动态代理一个非常重要的功能,就是“拦截”功能。...;而 observeOn() 的线程切换则发生在它内建的 Subscriber ,即发生在它即将给下一级 Subscriber 发送事件时,因此 observeOn() 控制的是它后面的线程

94410

Android RxJavaRxAndroid结合Retrofit使用

概述 RxJava是一个 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。更重要的是:使用RxJava代码逻辑上会非常简洁明了,尤其是复杂的逻辑上。告别迷之缩进。...观察者模式 假设现在有两个对象A和B,A发生某种变化时要主动通知B。这就是观察者模式。...没有的onNext()之后,调用此方法。 onError():事件队列异常。事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。...onCompleted() 和 onError()一个队列只能调用一个,并且是最后一个。...onCompleted() 和 onError()还是互斥的,只能调用其中一个 回顾Retrofit 上篇博文我们使用Retrofit实现对网络的访问以及返回数据的解析,详情请见Android 初探Retrofit2.0.1

1.2K100

Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(一)

AndroidX 是一个的扩展 库,用于向下兼容.支持, 28稳定版库将所有的v4,v7,后续功能将被整合到 androidx 包。...9.解决android.os.NetworkOnMainThreadException Android开发时,因为代码没有问题但总是报错。...最后查阅资料了解到,Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。...Android4.0以后,会发现,只要是写在主线程(就是Activity)的HTTP请求,运行时都会报错,这是因为Android4.0以后为了防止应用的ANR(Aplication Not Response...(推荐使用) // Android 4.0 之后不能在主线程请求HTTP请求 new Thread(new Runnable(){ @Override public void run(

2.6K11

Android学习路上会遇到的各种瓶颈总结

对于IT专业的学生来说,开学后就要面对各大IT企业的秋招,很多人会成为从0开始的Android实习生。Android初学之路上,每个Android实习生都会遇到各式各样的瓶颈。...网络请求和json解析 Android是移动互联网的重要组成部分,网络请求和Json解析是Android学习的重要环节,很多初学者会在此处遭遇瓶颈。...下班后要学习以上框架的源码和实现原理,比如Android的网络请求必须在子线程中进行,否则会造成NetworkOnMainThreadException;现在的网络请求都是基于HttpURLConnection...克服了以上瓶颈后,估计实习生也该到了毕业转正的时间了,进阶路上还有的瓶颈。...瓶颈有的玩法:这种玩法需要双手操作,如果用另一只手按住打开着的瓶口撸瓶颈,你可以一边撸一边使劲摇,玩HIGH的时候突然松开按住瓶口的手。

94980

Android】RxJava + Retrofit完成网络请求

在这片文章之前分别单独介绍过Rxjava以及Retrofit使用Android Retrofit 2.0 的使用 Android RxJava的使用(一)基本用法 (以及后面的几篇,就不一一列出了...phone, password) //获取Observable对象 .subscribeOn(Schedulers.newThread())//请求线程执行...可以看到,调用了service的login方法后得到Observable对象,线程执行网络请求,请求成功后切换到io线程执行保存用户信息的动作,最后再切换到主线程执行请求失败onError()、...{ return service.getUser(token); }) .subscribeOn(Schedulers.newThread())//请求线程执行请求...RxJava的使用就暂时介绍到这里吧,使用过程遇到好用的再出来跟大家分享。 以上有错误之处感谢指出 参考:给 Android 开发者的 RxJava 详解 (本文部分内容引用自该博客)

1K100

一个妹子的Android秋招面试总结(已拿BAT等7家口头offer)

中途发生个乌龙,牛客给头条hr发过简历,结果竟然误进了社招池,还发来了面试邀约……差点就去应聘Android高级工程师了emmm 面试部门及全部流程 杭州/阿里/数据技术及产品部:2轮技术面+交叉面...Q:了解SQLite的事务处理吗?是如何做的? Q:使用SQLite做批量操作有什么好的方法吗? Q:如果现在要删除SQLite中表的一个字段如何做? Q:使用SQLite时会有哪些优化操作?...为何推荐使用后者? Q:Android为何新增Binder来作为主要的IPC方式? Q:使用Binder进行数据传输的具体过程? Q:Binder框架ServiceManager的作用?...Q:主线程Looper的轮询死循环为何没有阻塞主线程? Q:使用Hanlder的postDealy()后消息队列会发生什么变化? 线程 Q:Android还了解哪些方便线程切换的类?...为什么会发生?常见哪些内存泄漏的例子?都是怎么解决的? Q:内存泄漏和内存溢出的区别? Q:什么情况会导致内存溢出? 谷歌动态 Q:是否了解和使用过谷歌推出的新技术?

2.3K20

Android RxJava 实战系列:优雅实现 网络请求嵌套回调

前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 ?...本系列文章主要基于 Rxjava 2.0 接下来的时间,我将持续推出 Android Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho...RxJava 的线程控制,关于Retrofit使用请看文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) 3.2 步骤实现 步骤1: 添加依赖 a.... Gradle加入Retrofit库的依赖 build.gradle dependencies { // Android 支持 Rxjava // 此处一定要注意使用RxJava2的版本 compile...总结 本文主要讲解了 Rxjava 变换操作符的实际开发需求场景:嵌套回调需求 ,并结合Retrofit 与RxJava 实现 接下来的时间,我将持续推出 Android Rxjava 2.0 的一系列文章

2.2K30

Carson带你学Android:网络请求库Retrofit源码分析

前言 Andrroid开发,网络请求十分常用 而在Android网络请求库Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜欢...(r); // 该Handler是上面获取的与Android线程绑定的Handler // UI线程进行对网络请求返回数据处理等操作。...这里的额外操作是线程转换,即将子线程切换到主线程 OkHttpCall的enqueue()是进行网络异步请求的:当你调用OkHttpCall.enqueue()时,回调的callback是线程,需要通过...,最终得到一个Response对象 步骤4:进行线程切换从而在主线程处理返回的数据结果 若使用了RxJava,则直接回调到主线程 异步请求的过程跟同步请求类似,唯一不同之处在于:异步请求会将回调方法交给回调执行器指定的线程执行...--> // 线程切换是通过一开始创建Retrofit对象时Platform检测到运行环境是Android时进行创建的:(之前已分析过) // 采用适配器模式 static class Android

1.1K20

Android RxJava应用:网络请求出错重连(结合Retrofit)

前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。...功能说明 功能需求说明 注:关于 Rxjava的retryWhen() 操作符的使用请看文章Android RxJava:功能性操作符 全面讲解 功能逻辑 实例说明 本例子:采用Get方法对...本实例侧重于说明 RxJava 的轮询需求,关于Retrofit使用请看文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) 3.2 步骤实现 步骤1: 添加依赖 a.... Gradle加入Retrofit库的依赖 build.gradle dependencies { // Android 支持 Rxjava // 此处一定要注意使用RxJava2的版本 compile...compile 'com.squareup.retrofit2:retrofit:2.1.0' // 衔接 Retrofit & RxJava // 此处一定要注意使用RxJava2的版本 compile

1.3K20

Android:RxJava 结合 Retrofit 全面实现 网络请求出错重连

前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。...功能说明 功能需求说明 注:关于 Rxjava的retryWhen() 操作符的使用请看文章Android RxJava:功能性操作符 全面讲解 功能逻辑 实例说明 本例子:采用Get方法对...本实例侧重于说明 RxJava 的轮询需求,关于Retrofit使用请看文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) 3.2 步骤实现 步骤1: 添加依赖 a.... Gradle加入Retrofit库的依赖 build.gradle dependencies { // Android 支持 Rxjava // 此处一定要注意使用RxJava2的版本 compile...、Eventbus) ,继续对 Android Rxjava 的实际开发需求场景进行深入讲解 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记 帮顶 / 评论点赞!

1.7K30
领券