android 中设置HttpURLConnection 超时并判断是否超时
设置超时:
URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(3000); //3s conn.setReadTimeout(3000); //3s conn.setDoOutput(true);
本来以为设置了超时程序就会自动返回,不会有异常了,经过反复调试,的确会抛出SocketTimeoutException 异常
在
out = conn.getOutputStream(); //只是一个承载post内容的东西,这里并没有发送,必须在getInputStream之前
这一句会卡主,然后就异常了,所以我们要判断是否超时,则捕捉SocketTimeoutException异常就可以
整个post请求方法代码如下:
public static String sendPostRequest(String url, Map<String, String> params, Map<String, String> headers) throws Exception { StringBuilder buf = new StringBuilder(); Set<Entry<String, String>> entrys = null; String result=null; // 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10 // if (params != null && !params.isEmpty()) { // entrys = params.entrySet(); // for (Map.Entry<String, String> entry : entrys) { // buf.append(entry.getKey()).append("=") // .append(URLEncoder.encode(entry.getValue(), "UTF-8")) // .append("&"); // } // buf.deleteCharAt(buf.length() - 1); // } //将参数化为xml 格式传输,格式为:<xml><datatype><![CDATA[3]]></datatype></xml> if (params != null && !params.isEmpty()) { entrys = params.entrySet(); buf.append("<xml>"); for (Map.Entry<String, String> entry : entrys) { buf.append("<").append(entry.getKey()).append("><![CDATA[") .append(URLEncoder.encode(entry.getValue(), "UTF-8")) .append("]]></").append(entry.getKey()).append(">"); } buf.append("</xml>"); } URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(3000); conn.setReadTimeout(3000); conn.setDoOutput(true); OutputStream out=null; try { out = conn.getOutputStream(); //只是一个承载post内容的东西,这里并没有发送,必须在getInputStream之前 out.write(buf.toString().getBytes("UTF-8")); out.flush(); if (headers != null && !headers.isEmpty()) { entrys = headers.entrySet(); for (Map.Entry<String, String> entry : entrys) { conn.setRequestProperty(entry.getKey(), entry.getValue()); } } //conn.getResponseCode(); // 为了发送成功 if (conn.getResponseCode() == 200) { // 获取响应的输入流对象 InputStream is = conn.getInputStream(); //真正的发送请求 // 创建字节输出流对象 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 定义读取的长度 int len = 0; // 定义缓冲区 byte buffer[] = new byte[1024]; // 按照缓冲区的大小,循环读取 while ((len = is.read(buffer)) != -1) { // 根据读取的长度写入到os对象中 baos.write(buffer, 0, len); } // 释放资源 is.close(); baos.close(); // 返回字符串 result = new String(baos.toByteArray()); } else { result = conn.getResponseCode()+""; } } catch (SocketTimeoutException ex) { result = "-3"; } return result; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。