android超时异常
A. android跳转http连接超时原因
网络请求超如租时。Android是一种启陵基于Linux内核的自由及开放源代码的操作系统渣旁兆,http是互联网上应用最为广泛的一种网络协议。android跳转http连接超时原因是网络请求超时。只需重新启动网络即可。
B. android中http get请求总是超时怎么办
检查网络,查看是否有权限,httpclient框架实现示例代码:
1. GET 方式传递参数
//先将参数放入List,再对参数进行URL编码
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "数据")); //增加参数1
params.add(new BasicNameValuePair("param2", "value2"));//增加参数2
String param = URLEncodedUtils.format(params, "UTF-8");//对参数编码
String baseUrl = "服务器接口完整URL";
HttpGet getMethod = new HttpGet(baseUrl + "?" + param);//将URL与参数拼接
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse response = httpClient.execute(getMethod); //发起GET请求
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//获取服务器响应内容
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2. POST方式 方式传递参数
//和GET方式一样,先将参数放入List
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));//增加参数1
params.add(new BasicNameValuePair("param2", "第二个参数"));//增加参数2
try {
HttpPost postMethod = new HttpPost(baseUrl);//创建一个post请求
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中
HttpResponse response = httpClient.execute(postMethod); //执行POST方法
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
C. Android BLE蓝牙连接异常处理
蓝牙通信过程中异常很常见,大致有以下几种:
1,连接
2,发现服务
3,读写
4,通知
连接失败可能是设备端原因,也可能是手机端原因。不同的手机来自不同的厂家,用的不同的芯片和蓝牙协议栈都会导致蓝牙功能的表现不一致,这都会导致各式各样的兼容性问题,可能有的手机连接成功率高,有的成功率低。设备端原因可能有些时候出现异常导致死机无响应,或某些参数设置得有问题。但对于Android应用层开发来说,能做的很有限,蓝牙通信是在系统服务进程中处理的,我们无法跨进程改变系统的行为,如果是在一个进程我们还可能通过Hook等手段来调整其内在逻辑。另外应用层的接口只是将请求封装传递给系统服务进程,并未做一些实质性的通信,所以应用层虽然是同一个进程的,但是Hook意义也不大。所以我们能做的仅仅是看怎样调整接口的调用,使得整体稳定性更好一点而已。
连接失败分两种,一种是超时,一种是提前返回失败。
关于超时,一般是设备不在周围,或设备断电未发广播,或设备当前被其他人连接。系统默认超时为30s,通常返回133,我们也可以自己设置更短的超时时间,超时则closeGatt,然后重新连接。
关于提前返回失败,一般是有明确的异常,可能是手机蓝牙的异常或者设备异常。
这两种情况建议closeGatt,延时500ms,然后重试。如果重试三次仍然失败,则可以考虑提示用户重启手机蓝牙,或者检查设备是否正常工作。
还有一种情况,连接成功后没过多久连接又断开了,这有可能是设备主动断开,连接成功后有的设备会等待鉴权,如果一定时间内手机端还未发起鉴权则设备端主动断开。也可能连接信道不够稳定导致断开的,此时closeGatt并重新连接即可。
当连接断开时,会收到onConnectionStateChanged回调,这个回调可能会有一定延时,甚至有5s以上。解决的办法是轮询,如每隔1s发起一次读请求,如果连接断了会立即返回失败。
如果蓝牙连接不稳定,可以考虑关掉WIFI,因为WIFI通常和蓝牙共用一个天线。
有的手机上discoverService可能会回调不止一次onServiceDiscover,这个要注意防御。
当连接建立后,可以由设备端发起更改连接间隔,这样能加快后续发现服务以及数据读写的速度。有的手机discover service很慢,原因是connect interval太大了,有的手机会主动向设备发起更改connect interval,而有的手机却不会。这样的话connect interval相差就会很大,实践中发现有的手机是7ms,有的手机是默认的50ms,所以发现service都要8s,甚至20s的都很寻常,这对用户来说是无法忍受的。所以比较好的办法是设备主动发起更改connect interval,而Android系统是没有提供对应API的。
如果发现服务失败,通常来说不用closeGatt,重试一下就好了。如果重试三次还失败,建议清一下缓存,再closeGatt,重新连接。
读写失败要看失败的原因是什么,如果是权限问题,则需要和设备端确认是否开放了相应的读写权限。也可能是要读写的character不存在,可能是设备端修改了固件,手机端需要刷新一下蓝牙缓存,closeGatt再重新连接。如果是其它未知错误,则重试三次,仍然失败则closeGatt。不过通常来说如果是因为连接出了问题导致读写失败的,会收到onConnectionStateChanged回调,此时就不用再无谓的重试了,直接closeGatt,重新连接。
打开/关闭character的notify,必须等收到onDescriptorWrite回调之后才算结束,才能开始下一个任务。
如果打开notify失败,则可以改成周期性轮询的方式去查询character的值。
可参考该文章
Android-BLE-Issues
D. 安卓广播超时的原因分析及优化建议
最终工作中经常碰到广播超时的问题,于是花精力脊汪总结了一番,各位客官请看~
从图中可以困野洞看出决定广播B接受者的广播接受是否超时,取汪枯决于广播A处理的时间和广播B处理的时间
E. android连接服务器提示连接超时,报IOException ,求解大神哪里有问题,之前还好好的,代码没有动过。
就是网络手兆连接喊丛失败了,,,,,检查网络是否通畅
在网郑薯樱络通讯中,连接失败是正常的事情,处理异常就是了
~~~~~~
F. android中如何获取超时时长的异常
android获取超时时长的异常方式如下:设置超时机制
client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY); // 超时设置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);// 连接超时
这里设置了两种超时,第一种是请求超时,第二种时连接超时。
当向服务器发出请求后,请求和服务器建立socket连接,但是很长时间内都没有建立socket连接,这就时第一种请求超时,这种情况主要发生在请求了
一个不存在的服务器。超时之后,会抛出InterruptedIOException异常。
Timeout for blocking operations. The argument value is specified in
milliseconds. An InterruptedIOException is thrown if this timeout
expires.
G. android okhttp超时怎么办
OkHttp是一个在开发可汗学院AndroidAPP过程中非常重要的依赖库。它的默认的配置为我们提供了非常重要实用功能,下面一些步骤我们可以让Okhttp提供功能使用灵活和内省能力。1.启用文件系统上的响应缓存默认情况下,Okhttp不支持响应缓存,包括HTTPCache-Control头允许缓存响应。因此,客户端通过一次又一次的请求相同的资源浪费时间和带宽。而不是简单地读取初始响应后缓存的副本。要在文件系统中启用响应缓存,需要配置com.squareup.okhttp.Cache实例,并把它传递给你的OkHttpClient实例的setCache方法。你必须初始化缓存与存放目录的文件,并以字节为单位的最大值。响应返回数据可以写入给定目录文件,如果一个响应的缓存超过了给定的大小。我们可以采取LRUpolicy。我们可以在stackoverflow查看JesseWilson的回复。我们可以通过context.getCacheDir()在子目录中缓存我们的响应://Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}//Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}在可汗学院的程序中我们指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas10*1024*1024,or10MB的大小2.集成StethoStetho是Facebook的一个可爱的库,可以使用Chrome浏览器的Chrome开发人员工具功能来检查你的Android应用程序。Stetho除了允许你检查你的应用程序的SQLite数据库,还可以查看View的层次结构。允许你检查由OkHttp发起的每个请求和响应:这种自省机制是确保服务器返回允许资源缓存的HTTP头是非常有用的,以及验证没有请求时,保证缓存的资源存在。要想使用Stetho,只需添加一个StethoInterceptor实例的网络拦截器列表:okHttpClient.networkInterceptors().add(newStethoInterceptor());okHttpClient.networkInterceptors().add(newStethoInterceptor());然后,运行应用程序,打开浏览器后,输入chrome://inspect。然后你就会看到应用程序的设备和标识符的列表。然后鼠标右键选择inspect打开开发者工具,然后打开新的tab,开始监控OkHttp请求。3.使用Picasso和Retrofit你可能使用过Picasso来加载网络图片,或者使用Retrofit来简化发出请求和解码响应。这些第三方库将隐式地创建自己的OkHttpClient供内部使用,如果你不明确指定一个。Picassoversion2.5.2的OkHttpDownloader类:(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}(){OkHttpClientclient=newOkHttpClient();client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS,TimeUnit.MILLISECONDS);returnclient;}Retrofit也有类似的工厂方法来创建自己的OkHttpClient。图片一般在应用程序中需要加载的比较大的资源。尽管Picasso自己维护它的LRU机制来缓存图片,在内存中严格执行。如果客户端尝试使用Picasso来加载图片。Picasso会找不到其在内存中缓存图像,然后将委托加载该图片到它的内部OkHttpClient实例。并且默认情况下该实例将始终从服务器加载图片资源。作为defaultOkHttpClient的方法不能与上面提到的文件系统中的响应缓存配置结合起来。指定你自己的OkHttpClient实例允许返回数据从文件系统缓存响应,图片不会从服务器加载。这是非常重要的在程序第一次启动以后。这个时候Picasso的内存缓存是冷的。所以它会频繁的委托OkHttpClient实例去加载图片。这就需要构建配置了您Picasso的OkHttpClient实例,如果你在你的代码中使用Picasso.with(context).load()Picasso.with(context).load()加载图片,你是用的是Picasso的单例模式。这是通过with方法懒汉模式地实例化并配置自己的OkHttpClient。因此,我们必须使我们自己的Picasso实例在单例之前通过wiht方法调用。实现这个,可以简单的将OkHttpClient实例封装在OkHttpDownloader中,然后传递给Picasso.Builder实例的downloader方法。finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);在Retrofit中要使用OkHttpClient实例,需要改造1.9.x的一个RestAdapter,需要将OkHttpClient封装OkClient的实例中。然后把它传递给RestAdapter.Builder实例的setClient方法。restAdapterBuilder.setClient(newOkClient(httpClient));restAdapterBuilder.setClient(newOkClient(httpClient));在Retrofit2.0中只需要简单的将OkHttpClient传递给Retrofit.Builder实例的client方法。在可汗学院的APP中我们通过Dagger依赖注入来确保我们只有一个OkHttpClient的实例。这种方法同样也适用于Picasso和Retrofit我们提供了一个为OkHttpClient实例提供单例模式的注解示例:@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient将会通过Dagger的注解创建一个实例提供给我们的Picasso和Retrofit。4.指定一个用户代理拦截器日志文件和分析为我们提供了有用的信息,当客户在每个请求提供详细的User-Agentheader值的时候。默认情况下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。为了指定我们自己的useragent。首先创建拦截器的替换值,我们可以看stackoverflow的建议。{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}为了创建User-Agentheader值人然后传递给UserAgentInterceptor的构造器,使用你得到的任何信息。我们可以使用:android的系统信息可以清晰的传递出这是一台android设备Build.MODEL或者“制造商提供的用户可见最终可见的名称”Build.BRAND或者“消费者可见的品牌与产品/硬件相关信息”Build.VERSION.SDK_INT或者“消费者可见的Android提供的SDK版本号”BuildConfig.APPLICATION_IDBuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE最后三个值由的applicationID,VERSIONCODE和VERSIONNAME的值在我们的Gradlebuild脚本中了解信息可以查看versioningyourapplications和请注意,如果您的应用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通过下面方法创建UserAgentInterceptor:WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);WebSettingssettings=webView.getSettings();settings.setUserAgentString(userAgentHeaderValue);5.指定合理的超时2.5.0版本之前,OkHttp请求默认为永不超时。2.5.0版本开始如果建立连接请求超时,如果从连接读取下一个字节或写入的下一个字节到连接,花费超过10秒,就终止。这样做需要更新到2.5.0版本我们就不需要在我们的代码中修改bug。原因很简单是我因为我们第一次使用的时候使用了错误的路径。要覆盖这些默认值,可以分别调用setConnectTimeout,setReadTimeout或setWriteTimeout。需要注意的是Picasso和Retrofit为OkHttpClient实例指定不同的超时值时,默认情况下,Picasso指定:连接超过15秒.读取超过20秒写入超过20秒而Retrofit指定:连接超过15秒.读取超过20秒没有写入超时通过配置Picasso和Retrofit自己的OkHttpClient实例你可以确保所有的请求超时是一致的
H. android版本的app在wifi下请求服务器会超时,但3G、4G下不会
1、首先我们就须要看看在苹果手机里的设置蜂窝移动网络有没有打开来,无法连接到itunesstore时,可能是手机中移动数据没有打开起来而导致无法正常连接到网络。
2、打开苹果手机里面的设置,进入到蜂窝移动网络
3、把蜂窝移动数据打开起来,然后看看登陆你的Apple ID看看
方法、步骤二:
1、也有可能是手机里面网络设置问题导致的,打开苹果手机设置进入通用里面。
2、按一下还原、还原网络设置
方法、步骤三:
Apple ID的问题,建议更换一下你登陆的Apple ID,通常在注册Apple
ID时,一些信息没有填写完整也会导致苹果手机无法连接到itunesstore,重新注册一个Apple ID或者使用别人的Apple ID登陆看看。
I. android友盟一键登录一直报超时
Android友盟一慧薯侍键登录超时的问题可能是由于网络原因或者友盟服务器出现故障导致的。首先,您可以检查一下自己的网络状况,确保网络正常。其次,您可以检查一下友盟服务器的状态,确保友盟服务器正常运行。最后,您可以尝试重新安前吵装友盟的SDK,以确保SDK的正确安装。如果以上方法都无法解决您的问题,建议您可以联系友盟客服,他们手哪会更加专业地帮助您解决问题。
J. 安卓软件启动时提示“网络请求超时!"是怎么回事请问高手要如何解决
我也试过这种情况,后来软件开发者在新版本中说:这种情况是软件的缺陷,也就是拆伏所谓旅手携的BUG,等待新版本的解决吧。有些软件的网络识别是很差的。薯李