api 14 后,getResponseCode()==HTTP_OK 异常的处理,主UI 连网,开线程连接的简单实现方法

在Android API 14及以上版本,由于性能优化,不再允许在主线程中进行网络操作。解决办法是开启新线程进行网络连接,并通过Handler在主线程中更新UI。本文介绍了如何处理httpconn.getResponseCode()==HttpURLConnection.HTTP_OK异常,以及如何正确地在后台线程和主线程间传递数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

httpconn.getResponseCode()==HttpURLConnection.HTTP_OK异常
的简单处理办法

安卓升级后,不再允许目标 超过 API 8 的 通过运行, 估计就是为了改善
性能,让新硬件可以充分发挥优势.多开几个线程,不等等,还能处理其他的任务
解决方案就是

  • 1.开线程运行连接
  • 2.把数据通过句柄消息发送给主UI 处理.
  • 3那些主UI 的所有的方法都只能通过消息.得到数据
//A 位置
 try{
    URL url=new URL(wikiSearchURL);
     HttpURLConnection httpconn=(HttpURLConnection)url.openConnection();
     //尽量简化,中国的超时,属性设置就不写了.
	if(httpconn.getResponseCode()==HttpURLConnection.HTTP_OK  ){//错误位置
	
	
		InputStreamReader inputStreamReader =new InputStreamReader
		(httpconn.getInputStream(), "utf-8");
		 int i;
         String content="";
          // 读取消息到 content 中
          while ((i = inputStreamReader.rea
<think>好的,我现在需要帮用户解决用Java编写HttpRequest类发送POST请求的问题。用户提到要包含URL、查询字符串参数和表单数据。首先,我得理清楚这些要求。 用户的需求是发送POST请求,同时包含查询字符串参数和表单数据。查询字符串参数通常附加在URL后面,而表单数据则是放在请求体中的。不过,POST请求的查询参数和表单数据有时候容易混淆,需要确认是否两者都需要。根据用户的描述,应该是URL中有查询参数,而请求体中是表单数据,比如multipart/form-data类型。 接下来,我需要考虑Java中如何实现。通常,发送HTTP请求可以使用HttpURLConnection或者第三方库如Apache HttpClient或OkHttp。但用户可能希望用标准库,所以优先考虑HttpURLConnection。 首先,构造URL,包括查询参数。例如,将type=socket&function=OCR等参数附加到基础URL上。可以使用URIBuilder或者手动拼接,但Java标准库中没有URIBuilder,所以可能需要手动处理URL编码。这里需要注意正确编码参数,使用URLEncoder.encode()方法。 然后,处理表单数据。用户提到Content-Disposition: form-data,说明需要multipart/form-data格式。这需要设置正确的Content-Type,并生成边界字符串。构建请求体时,每个参数部分需要用边界分隔,并且每个部分包含Content-Disposition头部和内容。 接下来是代码结构。创建一个HttpRequest类,可能包含设置URL、添加查询参数、添加表单数据的方法,以及执行请求的方法。考虑到连接配置,比如设置请求方法为POST,启用输出,设置超时时间,处理响应流等。 需要注意的是,处理multipart数据时,要正确生成边界,并且每个部分的数据格式要正确。此外,处理文件上传时,可能需要读取文件流,但用户示例中的表单数据是文本参数,所以暂时可以处理文本部分。 还要处理异常,比如IO异常,确保资源正确关闭,使用try-with-resources来自动管理流。 测试部分,用户可能需要一个main方法示例,展示如何调用这个类,添加参数,发送请求并获取响应。 可能的问题:编码是否正确,边界处理是否正确,请求头是否设置正确,以及如何处理响应。此外,用户可能需要处理更复杂的情况,比如文件上传,但当前问题可能只需要处理文本表单数据。 最后,根据用户提供的引用,他们可能参考了之前的问题,比如服务器端代码,所以可能需要确保客户端代码与服务器端兼容,比如使用正确的Content-Type和参数名称。 总结步骤: 1. 构建带查询参数的URL。 2. 创建HttpURLConnection,设置POST方法和必要的头。 3. 生成multipart/form-data请求体,包含表单参数。 4. 发送请求并读取响应。 需要检查每个步骤的实现细节,确保参数编码正确,请求体格式正确,以及正确处理响应。</think>以下是用Java实现支持查询参数和multipart/form-data表单的POST请求的完整解决方案: ### Java HttpRequest实现方案 ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public class HttpRequest { private String baseUrl; private Map<String, String> queryParams = new HashMap<>(); private Map<String, String> formData = new HashMap<>(); public HttpRequest(String baseUrl) { this.baseUrl = baseUrl; } public void addQueryParam(String key, String value) { queryParams.put(key, value); } public void addFormData(String key, String value) { formData.put(key, value); } public String execute() throws IOException { // 构建完整URL String fullUrl = buildUrlWithQueryParams(); URL url = new URL(fullUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求属性 connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); // 生成multipart边界 String boundary = "----WebKitFormBoundary" + System.currentTimeMillis(); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); try (OutputStream os = connection.getOutputStream(); PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8), true)) { // 写入表单数据 for (Map.Entry<String, String> entry : formData.entrySet()) { writer.append("--").append(boundary).append("\r\n"); writer.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"\r\n\r\n"); writer.append(entry.getValue()).append("\r\n"); } writer.append("--").append(boundary).append("--\r\n"); } // 读取响应 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } return response.toString(); } } else { throw new IOException("HTTP请求失败,响应码:" + responseCode); } } private String buildUrlWithQueryParams() throws UnsupportedEncodingException { if (queryParams.isEmpty()) return baseUrl; StringBuilder urlBuilder = new StringBuilder(baseUrl); urlBuilder.append("?"); for (Map.Entry<String, String> param : queryParams.entrySet()) { urlBuilder.append(URLEncoder.encode(param.getKey(), "UTF-8")) .append("=") .append(URLEncoder.encode(param.getValue(), "UTF-8")) .append("&"); } urlBuilder.deleteCharAt(urlBuilder.length() - 1); // 移除最后的& return urlBuilder.toString(); } // 使用示例 public static void main(String[] args) { HttpRequest request = new HttpRequest("http://example.com/api"); request.addQueryParam("type", "socket"); request.addQueryParam("function", "OCR"); request.addFormData("files[]", "file_content_here"); try { String response = request.execute(); System.out.println("响应内容:" + response); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 关键实现要点: 1. **URL参数处理**:通过`buildUrlWithQueryParams`方法自动拼接查询参数,使用`URLEncoder`进行正确编码[^1] 2. **Multipart格式生成**: - 使用随机生成的boundary分隔表单字段 - 每个表单字段包含标准Content-Disposition头部 3. **流处理优化**: - 使用try-with-resources自动关闭资源 - 设置UTF-8编码保障中文支持 4. **异常处理**:区分正常响应和错误状态码 5. **连接配置**:设置合理的超时时间(5秒)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值