安卓基于HttpURLConnection网络请求

安卓基于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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值