安卓基于HttpURLConnection网络请求
来源:互联网 发布:子贡曰君子一言以为知 编辑:程序博客网 时间:2024/05/21 17:18
安卓基于HttpURLConnection网络请求
实现GET请求及其POST请求,加入线程队列多线程时访问不崩溃。
加入取消线程队列,如页面跳转。
支持安卓6.0
在Handler里面实现回调,更改UI界面不崩溃。
点击这里免费下载源代码
两个参数为GET请求,三个参数为POST请求。
GET请求用法举例:
String url = "http://www.baidu.com"; Ynet.add(url, new YnetListener() { @Override public void response(boolean isSuccess, String url,String value, Map<String, Object> parameter) { if (isSuccess) { Log.e("请求成功", value); } else { Log.e("网络连接失败", value); } } });
POST用法举例:
String url = "http://www.baidu.com"; HashMap<String, Object> map = new HashMap<String, Object>(); map.put("user", "yujing"); Ynet.add(url, map,new YnetListener() { @Override public void response(boolean isSuccess, String url,String value, Map<String, Object> parameter) { if (isSuccess) { Log.e("请求成功", value); } else { Log.e("网络连接失败", value); } } });
是不是简单且方便。当网络请求失败value就是失败原因说明。比如超时,比如状态码为404。
下整个源代码:
package com.yujing.yhttp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.concurrent.ScheduledThreadPoolExecutor;import android.annotation.SuppressLint;import android.os.Handler;import android.os.Message;/** * @ClassName: Ynet * @Description: TODO(线程队列网络请求) * @author YuJing* @date 2016-1-26 上午9:50:09 */public class Ynet extends Thread { private String url; /**连接超时*/ private int connectTimeout=7000; /** 线程队列同时最多运行10个*/ private static ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(10); /** 数据和参数 */ private Map<String, Object> paramsMap; /**回调监听*/ private YnetListener ynetListener; /**是否为get请求*/ private boolean isGet=false; /** * @Title: add * @Description: TODO(创建一个网络连接并扔进线程队列) * @param url 网络连接地址 * @param paramsMap 参数 * @param ynetListener 监听回调 * @return Ynet 返回类型 * @throws */ public static Ynet add(String url, Map<String, Object> paramsMap, YnetListener ynetListener) { Ynet ynet=new Ynet(url, paramsMap, ynetListener); return ynet; } public static Ynet add(String url, YnetListener ynetListener) { Ynet ynet=new Ynet(url, ynetListener); return ynet; } /**构造函数*/ public Ynet(){} /**构造函数POST*/ public Ynet(String url, Map<String, Object> paramsMap, YnetListener ynetListener) { setConnect(url, paramsMap, ynetListener); } /**构造函数GET*/ public Ynet(String url, YnetListener ynetListener) { isGet=true; setConnect(url, null, ynetListener); } /** * @Title: setConnect * @Description: TODO(设置一个网络连接并扔进线程队列) * @param url 网络连接地址 * @param paramsMap 参数 * @param ynetListener 监听回调 * @return Ynet 返回类型 * @throws */ public Ynet setConnect(String url, Map<String, Object> paramsMap, YnetListener ynetListener) { this.url = url; this.paramsMap = paramsMap; this.ynetListener = ynetListener; exec.execute(this); return this; } /**停止当前队列中全部请求*/ public static void stopAll() { exec.getQueue().clear(); } /**设置网络连接超时时间*/ public Ynet setTimeout(int connectTimeout) { this.connectTimeout=connectTimeout; return this; } @Override public void run() { PrintWriter printWriter = null; BufferedReader bufferedReader = null; StringBuffer responseResult = new StringBuffer(); HttpURLConnection httpURLConnection = null; StringBuffer params = new StringBuffer(); // 组织请求参数 if (paramsMap != null) { Iterator<Entry<String, Object>> it = paramsMap.entrySet().iterator(); while (it.hasNext()) { Entry<String, Object> element = it.next(); params.append(element.getKey()); params.append("="); params.append(element.getValue()); params.append("&"); } if (params.length() > 0) { params.deleteCharAt(params.length() - 1); } } URL realUrl = null; try { realUrl = new URL(url); } catch (MalformedURLException e1) { sendBackMsg("请求地址错误", false); return; } try { // 打开和URL之间的连接 httpURLConnection = (HttpURLConnection) realUrl.openConnection(); httpURLConnection.setConnectTimeout(connectTimeout); // 设置通用的请求属性 //httpURLConnection.setRequestProperty("accept", "*/*"); //httpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); //httpURLConnection.setRequestProperty("Content-Length", String.valueOf(params.length())); httpURLConnection.setRequestProperty("Charset", "UTF-8"); if (isGet) { httpURLConnection.setRequestMethod("GET"); }else { httpURLConnection.setRequestMethod("POST"); // 发送POST请求必须设置如下两行 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true); // 获取URLConnection对象对应的输出流 printWriter = new PrintWriter(httpURLConnection.getOutputStream()); // 发送请求参数 printWriter.write(params.toString()); // flush输出流的缓冲 printWriter.flush(); } // 定义BufferedReader输入流来读取URL的ResponseData InputStream inputStream=httpURLConnection.getInputStream(); InputStreamReader inputStreamReader=new InputStreamReader(inputStream); bufferedReader = new BufferedReader(inputStreamReader); String line; while ((line = bufferedReader.readLine()) != null) { responseResult.append("\n").append(line); } // 根据ResponseCode判断连接是否成功 int responseCode = httpURLConnection.getResponseCode(); if (responseCode == 200) { sendBackMsg(new String(responseResult.toString().getBytes("UTF-8")), true); } else { sendBackMsg("网络异常,状态码:" + responseCode, false); } } catch (java.net.SocketTimeoutException e) { sendBackMsg("网络连接超时", false); //e.printStackTrace(); } catch (UnsupportedEncodingException e) { sendBackMsg("数据解析错误", false); //e.printStackTrace(); } catch (IOException e) { sendBackMsg("网络连接错误", false); //e.printStackTrace(); } finally { httpURLConnection.disconnect(); try { if (printWriter != null) { printWriter.close(); } if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException ex) { ex.printStackTrace(); } } super.run(); } /** 发回数据结果到消息队列*/ private void sendBackMsg(String str, boolean success) { Message msg = new Message(); if (success) { msg.what = 0; } else { msg.what = 1; } msg.obj = str; handler.sendMessage(msg); } /**消息传递收到后回调监听器 */ @SuppressLint("HandlerLeak") private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (ynetListener != null) { String value = (String) msg.obj; if (msg.what == 0) { ynetListener.response(true, url, value, paramsMap); } else if (msg.what == 1) { ynetListener.response(false, url, value, paramsMap); } } } }; /** * @ClassName: YnetListener * @Description: TODO(消息回调监听器) * @author YuJing * @date 2016-1-18 上午9:49:45 */ public interface YnetListener { public void response(boolean isSuccess, String url, String value, Map<String, Object> parameter); }}
点击这里免费下载源代码
0 0
- 安卓基于HttpURLConnection网络请求
- 安卓开发之网络请求HttpURLConnection
- Android基于HttpURLConnection网络请求
- 安卓网络请求
- 安卓网络-冰山一角之httpurlconnection
- 请求网络之HttpUrlConnection
- HttpURLConnection请求网络
- HttpURLConnection 网络请求数据
- HttpURLConnection+URl网络请求
- HttpURLConnection网络请求
- HttpURLConnection网络请求
- HttpUrlConnection网络请求
- HttpURLConnection请求网络
- HttpURLConnection实现网络请求
- URLConnection &HttpURLConnection 网络请求
- HttpURLConnection 请求网络
- HttpURLConnection、HttpClient网络请求
- HttpURLConnection网络请求
- Tomcat配置Https 单向/双向
- target specifies product type 'com.apple.product-type.bundle.ui-testing'
- 开机后的第一条指令
- WebSocket实现多屏互动的分析及方案
- Turtlebot学习指导第五篇_搭建自己的ROS机器人的核心,配置navigation包并创建基本的启动文件
- 安卓基于HttpURLConnection网络请求
- Mac OS X pip 安装package时问题
- 快速排序
- android系统媒体库开发之图片
- jemeter遍历访问URL
- eclipse远程调试时出现:Failed to connect to remote VM. Connection refused. Connection refused: connect
- iOS-ERROR ITMS-90046: "Invalid Code Signing Entitlements.
- 原生javascript实现ajax 发送post请求
- iOS开发系列手势、音频