使用OkHttp3遇到的一些坑
来源:互联网 发布:php html页面生成图片 编辑:程序博客网 时间:2024/06/06 01:53
使用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; }
阅读全文
0 0
- 使用OkHttp3遇到的一些坑
- Retrofit2.0 + OkHttp3 遇到的坑
- okhttp3的简单使用
- okhttp3的使用
- OkHttp3的使用
- okHttp3的简单使用
- OKhttp3的基本使用
- OkHttp3的使用
- 使用cordova遇到的一些坑
- WKWebView使用遇到的一些坑
- 使用Spark遇到的一些坑
- 使用Glide遇到的一些坑
- rxjava2 + retrofit2 + okhttp3遇到的问题
- okhttp3基础使用的封装
- Android okhttp3的基本使用
- OkHttp3的使用,代码奉上
- okhttp3版 piccaso的使用
- Android okhttp3的使用详解
- 封装ajax
- display:none和visibility:hidden的区别
- JQuery-鼠标悬停显示全部内容
- HTML 属性继承与默认
- 微信小程序IOS端showLoading之后showToast不显示
- 使用OkHttp3遇到的一些坑
- 系统信号介绍
- git 常用指令
- eclipse中项目名称上有错误,但是项目里代码没错误
- Tomcat管理后台整改建议
- 268. Missing Number
- Win使用FlashFXP登录ubuntu共享文件配置方法
- Android之NetworkOnMainThreadException异常
- java 远程文件 下载