android okhttp超时怎么办
OkHttp是一个在开发可汗学院AndroidAPP过程中非常重要的依赖库。它的默认的配置为我们提供了非常重要实用功能,下面一些步骤我们可以让Okhttp提供功能使用灵活和内省能力。1启用文件系统上的响应缓存默认情况下,Okhttp不支持响应缓存,包括HTTPCache-Control头允许缓存响应。因此,客户端通过一次又一次的请求相同的资源浪费时间和带宽。而不是简单地读取初始响应后缓存的副本。要在文件系统中启用响应缓存,需要配置comsquareupokhttpCache实例,并把它传递给你的OkHttpClient实例的setCache方法。你必须初始化缓存与存放目录的文件,并以字节为单位的最大值。响应返回数据可以写入给定目录文件,如果一个响应的缓存超过了给定的大小。我们可以采取LRUpolicy。我们可以在stackoverflow查看JesseWilson的回复。我们可以通过contextgetCacheDir()在子目录中缓存我们的响应://Basedirectoryrecommendedby/q/4441849/400717final@NullableFilebaseDir=contextgetCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClientsetCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}//Basedirectoryrecommendedby/q/4441849/400717final@NullableFilebaseDir=contextgetCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClientsetCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}在可汗学院的程序中我们指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas1010241024,or10MB的大小2集成StethoStetho是Facebook的一个可爱的库,可以使用Chrome浏览器的Chrome开发人员工具功能来检查你的Android应用程序。Stetho除了允许你检查你的应用程序的SQLite数据库,还可以查看View的层次结构。允许你检查由OkHttp发起的每个请求和响应:这种自省机制是确保服务器返回允许资源缓存的HTTP头是非常有用的,以及验证没有请求时,保证缓存的资源存在。要想使用Stetho,只需添加一个StethoInterceptor实例的网络拦截器列表:okHttpClientnetworkInterceptors()add(newStethoInterceptor());okHttpClientnetworkInterceptors()add(newStethoInterceptor());然后,运行应用程序,打开浏览器后,输入chrome://inspect。然后你就会看到应用程序的设备和标识符的列表。然后鼠标右键选择inspect打开开发者工具,然后打开新的tab,开始监控OkHttp请求。3使用Picasso和Retrofit你可能使用过Picasso来加载网络,或者使用Retrofit来简化发出请求和解码响应。这些第三方库将隐式地创建自己的OkHttpClient供内部使用,如果你不明确指定一个。Picassoversion252的OkHttpDownloader类:privatestaticOkHttpClientdefaultOkHttpClient(){OkHttpClientclient=newOkHttpClient();clientsetConnectTimeout(UtilsDEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);clientsetReadTimeout(UtilsDEFAULT_READ_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);clientsetWriteTimeout(UtilsDEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);returnclient;}privatestaticOkHttpClientdefaultOkHttpClient(){OkHttpClientclient=newOkHttpClient();clientsetConnectTimeout(UtilsDEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);clientsetReadTimeout(UtilsDEFAULT_READ_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);clientsetWriteTimeout(UtilsDEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnitMILLISECONDS);returnclient;}Retrofit也有类似的工厂方法来创建自己的OkHttpClient。一般在应用程序中需要加载的比较大的资源。尽管Picasso自己维护它的LRU机制来缓存,在内存中严格执行。如果客户端尝试使用Picasso来加载。Picasso会找不到其在内存中缓存图像,然后将委托加载该到它的内部OkHttpClient实例。并且默认情况下该实例将始终从服务器加载资源。作为defaultOkHttpClient的方法不能与上面提到的文件系统中的响应缓存配置结合起来。指定你自己的OkHttpClient实例允许返回数据从文件系统缓存响应,不会从服务器加载。这是非常重要的在程序第一次启动以后。这个时候Picasso的内存缓存是冷的。所以它会频繁的委托OkHttpClient实例去加载。这就需要构建配置了您Picasso的OkHttpClient实例,如果你在你的代码中使用Picassowith(context)load()Picassowith(context)load()加载,你是用的是Picasso的单例模式。这是通过with方法懒汉模式地实例化并配置自己的OkHttpClient。因此,我们必须使我们自己的Picasso实例在单例之前通过wiht方法调用。实现这个,可以简单的将OkHttpClient实例封装在OkHttpDownloader中,然后传递给PicassoBuilder实例的downloader方法。finalPicassopicasso=newPicassoBuilder(context)downloader(newOkHttpDownloader(okHttpClient))build();//Theclientshouldinjectthisinstancewheneveritisneeded,butreplacethesingleton//instancejustincasePicassosetSingletonInstance(picasso);finalPicassopicasso=newPicassoBuilder(context)downloader(newOkHttpDownloader(okHttpClient))build();//Theclientshouldinjectthisinstancewheneveritisneeded,butreplacethesingleton//instancejustincasePicassosetSingletonInstance(picasso);在Retrofit中要使用OkHttpClient实例,需要改造19x的一个RestAdapter,需要将OkHttpClient封装OkClient的实例中。然后把它传递给RestAdapterBuilder实例的setClient方法。restAdapterBuildersetClient(newOkClient(httpClient));restAdapterBuildersetClient(newOkClient(httpClient));在Retrofit20中只需要简单的将OkHttpClient传递给RetrofitBuilder实例的client方法。在可汗学院的APP中我们通过Dagger依赖注入来确保我们只有一个OkHttpClient的实例。这种方法同样也适用于Picasso和Retrofit我们提供了一个为OkHttpClient实例提供单例模式的注解示例:@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@SingletonpublicOkHttpClientokHttpClient(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient将会通过Dagger的注解创建一个实例提供给我们的Picasso和Retrofit。4指定一个用户代理拦截器日志文件和分析为我们提供了有用的信息,当客户在每个请求提供详细的User-Agentheader值的时候。默认情况下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。为了指定我们自己的useragent。首先创建拦截器的替换值,我们可以看stackoverflow的建议。publicfinalclassUserAgentInterceptorimplementsInterceptor{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";privatefinalStringuserAgentHeaderValue;publicUserAgentInterceptor(StringuserAgentHeaderValue){thisuserAgentHeaderValue=PreconditionscheckNotNull(userAgentHeaderValue);}@OverridepublicResponseintercept(Chainchain)throwsIOException{finalRequestoriginalRequest=chainrequest();finalRequestrequestWithUserAgent=originalRequestnewBuilder()removeHeader(USER_AGENT_HEADER_NAME)addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue)build();returnchainproceed(requestWithUserAgent);}}publicfinalclassUserAgentInterceptorimplementsInterceptor{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";privatefinalStringuserAgentHeaderValue;publicUserAgentInterceptor(StringuserAgentHeaderValue){thisuserAgentHeaderValue=PreconditionscheckNotNull(userAgentHeaderValue);}@OverridepublicResponseintercept(Chainchain)throwsIOException{finalRequestoriginalRequest=chainrequest();finalRequestrequestWithUserAgent=originalRequestnewBuilder()removeHeader(USER_AGENT_HEADER_NAME)addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue)build();returnchainproceed(requestWithUserAgent);}}为了创建User-Agentheader值人然后传递给UserAgentInterceptor的构造器,使用你得到的任何信息。我们可以使用:android的系统信息可以清晰的传递出这是一台android设备BuildMODEL或者“制造商提供的用户可见最终可见的名称”BuildBRAND或者“消费者可见的品牌与产品/硬件相关信息”BuildVERSIONSDK_INT或者“消费者可见的Android提供的SDK版本号”BuildConfigAPPLICATION_IDBuildConfigVERSION_NAMEBuildConfigVERSION_CODE最后三个值由的applicationID,VERSIONCODE和VERSIONNAME的值在我们的Gradlebuild脚本中了解信息可以查看versioningyourapplications和configuringyourapplicationIdwithGradle请注意,如果您的应用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通过下面方法创建UserAgentInterceptor:WebSettingssettings=webViewgetSettings();settingssetUserAgentString(userAgentHeaderValue);WebSettingssettings=webViewgetSettings();settingssetUserAgentString(userAgentHeaderValue);5指定合理的超时250版本之前,OkHttp请求默认为永不超时。250版本开始如果建立连接请求超时,如果从连接读取下一个字节或写入的下一个字节到连接,花费超过10秒,就终止。这样做需要更新到250版本我们就不需要在我们的代码中修改bug。原因很简单是我因为我们第一次使用的时候使用了错误的路径。要覆盖这些默认值,可以分别调用setConnectTimeout,setReadTimeout或setWriteTimeout。需要注意的是Picasso和Retrofit为OkHttpClient实例指定不同的超时值时,默认情况下,Picasso指定:连接超过15秒读取超过20秒写入超过20秒而Retrofit指定:连接超过15秒读取超过20秒没有写入超时通过配置Picasso和Retrofit自己的OkHttpClient实例你可以确保所有的请求超时是一致的
第一,ConnectionPoolTimeout:
定义了从ConnectionManager管理的连接池中取出连接的超时时间。
出错会抛出ConnectionPoolTimeoutException
第二,ConnectionTimeout:
定义了通过网络与服务器建立连接的超时时间,Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间。
当连接HTTP服务器或者等待HttpConnectionManager管理的一个有效连接超时出错会抛出ConnectionTimeoutException
第三,SocketTimeout:
这定义了Socket读数据的超时时间,即从服务器获取响应数据需要等待的时间。
当读取或者接收Socket超时会抛出SocketTimeoutException
您好,我是这样设置的,代码如下:
public static InputStream getHttpByApache(String urlStr) throws Exception {
HttpGet httpGet = new HttpGet(urlStr);
HttpClient httpClient = new DefaultHttpClient();
// 设置连接超时、读取超时
HttpParams basicHttpParams = new BasicHttpParams();
HttpConnectionParamssetConnectionTimeout(basicHttpParams, 3 1000);
HttpConnectionParamssetSoTimeout(basicHttpParams, 3 1000);
HttpResponse httpResponse = httpClientexecute(httpGet);
if (httpResponsegetStatusLine()getStatusCode() == HttpStatusSC_OK) {
return httpResponsegetEntity()getContent();
}
return null;
}
超过规定时间,接受信息失败。
在网络问题方面,超时即当网络设备想在某个特定时间内从另一网络设备上接收信息,但是失败的情况。其结果常为:重新传输信息或解除两设备间的会话。若服务器超时但尚未掉线,则表明你的网络连接处于超微弱链接状态。此时,你可查看Modem的温度是否过高。
你的想实现这样的功能?还是你在编写时遇到了这样的问题啊。按照这个思路应该是A为登陆页面连接服务器做查询数据库操作,并以JSON返回给A去判断是否能通过一致性检验,B为主界面,CD类似于标签页面。这些界面的网络请求你可以用Volleyjar这个框架去做,而登陆超时。你可以设置一个计时器,当B开始显示之后开始计时,在发网络请求之前。先判断计时器是否超时。
设置等待和请求时间,超过10秒失败BasicHttpParams httpParams = new BasicHttpParams();HttpConnectionParamssetConnectionTimeout(httpParams, REQUEST_TIMEOUT);HttpConnectionParamssetSoTimeout(httpParams, SO_TIMEOUT);
0条评论