使用OkHttp3遇到的一些坑
使用OkHttp3遇到的一些坑(一)
其实这个我相信很多人都见过….我之前遇到了好几次,也见有人问,在这里简单总结一下我遇到的坑
1.调用了2次response.body().string()
代码如下(这里是Kotlin,Java和这个差不多):
//使用okhttp3访问网络
val builder = Request.Builder()
val request = builder.url(NEWS_URL).get().build()
val response = client.newCall(request).execute()
val responseBody = response.body()
val result = responseBody?.string()
//这里的.string()只能用一次 如果下面那一句不注释的话就会报错
//val result2 = responseBody?.string()
.string()调用2次就会引来下面错误
08-04 09:11:32.059 10176-10176/com.xfhy.baseadapterpackage E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xfhy.baseadapterpackage, PID: 10176
io.reactivex.exceptions.OnErrorNotImplementedException: closed
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:179)
at android.app.ActivityThread.main(ActivityThread.java:5739)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
Caused by: java.lang.IllegalStateException: closed
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:398)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:392)
at okhttp3.internal.Util.bomAwareCharset(Util.java:431)
at okhttp3.ResponseBody.string(ResponseBody.java:174)
at com.xfhy.baseadapterpackage.MainActivity$initData$1.subscribe(MainActivity.kt:50)
at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
at io.reactivex.Observable.subscribe(Observable.java:10901)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
可以看到是Caused by: java.lang.IllegalStateException: closed,可能是在第一次调用之后就关闭了资源.然后我去查看源码:
public final String string() throws IOException {
BufferedSource source = source();
try {
Charset charset = Util.bomAwareCharset(source, charset());
return source.readString(charset);
} finally {
Util.closeQuietly(source);
}
}
果然不出我所料,在finally里有一个Util.closeQuietly(source);关闭资源…..怪不得只能调一次呢…下次可要记住啦!!!
2.当在无网络的时候用OkHttp3访问网络会抛异常
情节还是比较严重的,反正我之前写的时候还没发现,因为之前写的时候判断了当前的网络状态的,昨晚写一个小demo时没有判断,直接就崩了….情况严重
大概的异常信息如下:
08-04 09:25:17.995 11031-11031/com.xfhy.baseadapterpackage W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: Unable to resolve host "xfhy-json.oss-cn-shanghai.aliyuncs.com": No address associated with hostname
08-04 09:25:17.995 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at android.os.Looper.loop(Looper.java:179)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5739)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.lang.reflect.Method.invoke(Native Method)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: Caused by: java.net.UnknownHostException: Unable to resolve host "xfhy-json.oss-cn-shanghai.aliyuncs.com": No address associated with hostname
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:470)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.net.InetAddress.getAllByName(InetAddress.java:215)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.Dns$1.lookup(Dns.java:39)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:171)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:137)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:82)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:171)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at okhttp3.RealCall.execute(RealCall.java:69)
08-04 09:25:17.996 11031-11031/com.xfhy.baseadapterpackage W/System.err: at com.xfhy.baseadapterpackage.MainActivity$initData$1.subscribe(MainActivity.kt:47)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.Observable.subscribe(Observable.java:10901)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.lang.Thread.run(Thread.java:818)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at libcore.io.Posix.android_getaddrinfo(Native Method)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage W/System.err: ... 35 more
08-04 09:25:17.997 11031-11031/com.xfhy.baseadapterpackage E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xfhy.baseadapterpackage, PID: 11031
所以,在使用OkHttp3访问网络的时候还是判断一下当前的网络状态比较好.
判断网络状态
代码如下:
/**
* 网络连接是否正常
*
* @return true:有网络 false:无网络
*/
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具