由于手机端应用的响应,与当时的无线通信网络状况有很大的关联。而通信网络往往具有不稳定,延迟长的特点。所以,在我们的应用程序中,当我们请求网络的时候,超时机制的应用就显得特别重要。
超时机制主要有:
1、HTTP请求超时机制
2、Socket通信超时机制
HTTP请求超时机制
public static void main(String[] args){
long a=System.currentTimeMillis();
try{
URL myurl = new URL(“http://www.baidu.cn”);
URLConnection myurlcon = myurl.openConnection();
myurlcon.setConnectTimeout(1000);
myurlcon.setReadTimeout(1000);
BufferedReader in = new BufferedReader(new InputStreamReader(myurlcon.getInputStream(),”UTF-8″));
String inputLine;
while ((inputLine = in.readLine()) != null){
System.out.println(inputLine);
in.close();
System.out.println(System.currentTimeMillis()-a);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果超时 将 抛出 以下 异常
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:313)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:606)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:554)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:940)
at com.Test.main(Test.java:52)
补充内容:
在android项目中,如果有用到http请求,就必须也应该加上http请求的超时管理,异常管理,项目中遇到这个需求,google上搜索到了一大堆,但是写的都比较简单,做个demo还行,用在项目中还是不够完善。自己写了一个例子,有不完善之处,欢迎大家指正。
需要注意的地方:有三个方面
如何控制超时机制
如何处理异常
如何处理请求错误的
private class XmlAsyncLoader extends XmlResourceRequest {
private boolean mIsCancle = false;
private HttpGet mGet;
private HttpClient mHttp;
public XmlAsyncLoader(MxActivity<?> activity, String url)
throws MalformedURLException {
super(activity, url);
}
@Override
protected void doTaskInBackground() {
// 请求数据
if (mUrl.toLowerCase().startsWith("http://")) {
mGet = initHttpGet(mUrl);
mHttp = initHttp();
try {
HttpResponse response = mHttp.execute(mGet);
if (mIsCancle) {
return;
}
if (response != null) {
if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){
onResponseError("network error");
Log.v(TAG, "the code is :"+response.getStatusLine().getStatusCode());
return;
}
notifyUpdateProgress(70);
Document doc = getDocumet(response);
Element root = doc.getDocumentElement();
NodeList appList = root
.getElementsByTagName(Item_ELEMENT_NAME);
final int len = appList.getLength();
if (len <= 0) {// 没有items
onFoundNoItems();
return;
}
for (int i = 0; i < len; i++) {
Element item = (Element) appList.item(i);
if (item.getNodeType() == Node.ELEMENT_NODE) {
HahaItemInfo info = createHahaItemIno(item);
if (mIsCancle){
return;
}
onFoundItem(info, 80 + 20 * (i + 1) / len);
addUrlToQueue(info.userIconUrl);
}
};
}
}catch(ConnectTimeoutException e){
onResponseError("time out");
} catch (ClientProtocolException e) {
--mCurrentPage;
e.printStackTrace();
} catch (IOException e) {
--mCurrentPage;
e.printStackTrace();
} catch (XmlPullParserException e) {
--mCurrentPage;
e.printStackTrace();
}finally{
notifyLoadFinish();
notifyLoadImages();
mHttp.getConnectionManager().shutdown();
}
}
}
private HttpClient initHttp() {
HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter(
HttpConnectionParams.SO_TIMEOUT, TIME_OUT_DELAY); // 超时设置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, TIME_OUT_DELAY);// 连接超时
return client;
}
private HttpGet initHttpGet(String mUrl) {
HttpGet get = new HttpGet(mUrl);
initHeader(get);
return get;
}
@Override
public boolean tryCancel() {
Log.i(TAG, "tryCanle is working");
mGet.abort();
mIsCancle = true;
mHttp.getConnectionManager().shutdown();
notifyLoadFinish();
return true;
}
}
这是一个异步任务类,发送get请求请求数据,解析服务器的响应数据,同时通知ui线程更新ui
在android中,互联网交互的写法有很多,可以使用apache提供的包,也可以使用google提供的api,我不知道那种更好,只是习惯于使用
apache的api。
1. 设置超时机制
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.
客户端已经与服务器建立了socket连接,但是服务器并没有处理客户端的请求,没有相应服务器,这就是第二种连接超时。这中超时会抛出
ConnectTimeoutException异常,ConnectTimeoutException继承自InterruptedIOException,所以只要捕获ConnectTimeoutException 就可以了。
2. 分析一下请求的过程
2.1 HttpResponse response = mHttp.execute(mGet);
执行请求方法,获取服务器响应,(这里有个不太成熟的看法,response不可能为null,还有待验证)。
2.2 获取请求响应码
if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){ onResponseError("network error"); Log.v(TAG, "the code is :"+response.getStatusLine().getStatusCode()); return; }
即使连接上服务器,并且从服务器上获取了数据,也有可能时服务器返回的错误信息,因此也需要特殊处理。
2.3 异常处理
对于异常,不能简单的捕获就完事,例如上面的代码中,我请求第三页的数据,如果发生异常,请求不成功,那么我就需要让当前页数回滚,
如果成功了就不用回滚了,所以需要对异常进行处理
2.4 finally关键字
不管是请求成功,还是失败,都需要关闭链接。
分享到:
相关推荐
下面将详细讲解这一主题,包括网络连接的检测、请求的成功与失败判断、超时机制的理解以及如何在实际项目中应用。 首先,我们需要判断网络连接的状态。Android提供了多种方法来检查设备是否已连接到网络,例如通过`...
超时机制是防止程序无限制等待而设置的一种保护措施。 要创建一个进度条对话框,我们可以使用Android自带的`ProgressDialog`或者更现代的`ProgressBar`配合`AlertDialog`。首先,在布局文件中定义一个进度条: ```...
Volley是Google推出的一款高效的Android网络请求库,它以其轻量级、高性能和易于使用的特点在开发者中广受欢迎。在实际应用中,我们有时需要根据网络环境或业务需求调整Volley的默认设置,例如修改请求头(Request ...
### Android Http (Json) 服务器端和客户端通信详解 在当今移动互联网时代,客户端与服务器之间的数据交换变得至关重要。特别是对于Android应用开发而言,能够高效、安全地与服务器进行通信,是实现应用功能的关键...
在Android开发中,HTTP客户端是应用与服务器进行数据交互的重要组成部分。这个压缩包"Android Http客户端源码.rar"很可能包含了实现Android平台上的HTTP请求的源代码。以下是对Android HTTP客户端相关知识点的详细...
在Android开发中,进行HTTP通信是常见的操作,用于与服务器交换数据。HTTP(超文本传输协议)是一种基于TCP/IP通信协议来交换数据的应用层协议,广泛应用于网页浏览、API交互等场景。本教程将深入讲解如何在Android...
在Android开发中,进行HTTP网络请求是常见的任务,用于与服务器交换数据,如获取或提交用户信息、加载图片等。本篇文章将详细讲解如何使用一个名为"Webconnect"的框架来执行HTTP请求,并探讨相关的核心知识点。 ...
在Android平台上,HTTP(超文本传输协议)是用于在客户端(比如我们的Android应用)和服务器之间交换数据的主要机制。这个“http.rar_android_android http”压缩包文件似乎包含了一些关于在Android环境中实现HTTP...
Android应用需要建立一个事件订阅机制,接收并处理这些事件。 **Android实现挑战** 在Android上实现ONVIF协议面临的一些挑战包括: - **网络权限**:Android系统对网络访问有严格的限制,需要确保应用拥有适当的...
Android-Async-Http是一个流行的开源库,用于在Android应用程序中执行异步HTTP请求。这个库由Loopj开发,简化了网络交互的过程,使得开发者能够更高效地处理网络操作,而无需阻塞主线程,从而避免ANR(Application ...
在Android开发中,网络通信是应用功能不可或缺的一部分,而HTTP协议是互联网上应用最广泛的一种网络协议。...在实际项目中,还需要根据具体需求优化网络请求,如添加超时处理、缓存策略、错误重试机制等。
在Android平台上,多线程下载机制是提升应用性能和用户体验的关键技术之一,特别是在处理大文件如应用程序、视频或音频资源的下载场景中。通过利用多线程,我们可以将一个大文件分割成多个小部分,然后同时启动多个...
Android提供了内置的HTTP缓存机制,也可以自定义缓存策略。此外,使用Gson或Jackson等库可以方便地序列化和反序列化JSON数据。 在`httpTest`这个文件中,可能包含了实现上述功能的代码示例。通过查看和分析这些代码...
使用时,根据实际需求,可以对请求参数、超时时间、重试机制、错误处理等方面进行定制。 在Android网络编程中,还需要注意以下几点: 1. **权限声明**:确保在AndroidManifest.xml中添加了`INTERNET`权限,否则应用...
在Android P 9.0系统中,HTTP支持成为了一个引人关注的话题,因为在此之前的版本,Google已经开始推动开发者转向更安全的HTTPS协议。然而,Android P并没有完全废弃HTTP支持,而是为开发者提供了一种在必要时使用...
在Android开发中,通信机制是实现应用程序与服务器交互的关键技术,涵盖了多种协议和方式,如Socket、HTTP和SSL。这些技术对于构建网络功能丰富的移动应用至关重要。以下是对这些通信方式的详细说明: 1. **Socket...
- 在回调中处理网络错误,如超时、连接失败等,可能需要重试机制。 - 对于大文件下载,可以使用`RequestBody`和`ProgressRequestBody`实现下载进度监听,以更新UI。 7. **多线程和线程池**: - 为了不阻塞主线程...
**OkHttp**:由Square公司开发,特点是性能高、支持HTTP/2和SPDY协议、重试和缓存机制。 **Retrofit**:结合了注解和依赖注入,使网络请求更像调用本地方法,易于测试和维护。 在"TestHttp"项目中,可能包含了对...
因此,`AndroidHttp`可能使用了AsyncTask、IntentService或现代的协程等异步机制来处理网络请求。 1. **HttpURLConnection**:在早期的Android版本中,HttpURLConnection是推荐的HTTP客户端API,因为它提供了更少的...