安卓基于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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机忘记访问限制密码怎么办 苹果忘记访问限制密码怎么办 苹果限制访问密码忘了怎么办 东奥会计书盗版怎么办 合同封印少盖一页怎么办 玩单机游戏屏幕输入不支持怎么办 汽车不小心陷进泥潭怎么办 招商银行信用卡激活电话换了怎么办 冲鼻子是耳朵进水了怎么办 不小心点了赞怎么办 小车间太热了怎么办 在车间上班好热怎么办 英雄杀四星李逵不拉仇恨怎么办 手表玻璃里面有雾水怎么办 dw手表玻璃碎了怎么办 手表玻璃面花了怎么办 有个窝囊的父母怎么办 苹果7p玩游戏卡怎么办 三星玩游戏很卡怎么办 三星打游戏很卡怎么办 香水喷到眼睛里怎么办 萍果平板锁机怎么办? 苹果6开机卡死怎么办 辐射4发夹用完了怎么办 辐射4多的武器怎么办 大姨妈恶心想吐怎么办 玩完游戏想吐怎么办 玩完了海盗船想吐怎么办 戴眼镜恶心想吐怎么办 玩电脑恶心想吐怎么办 玩游戏玩的头疼怎么办 玩游戏头疼想吐怎么办 游戏玩久了头疼怎么办 有3d眩晕症怎么办 玩游戏晕3d怎么办 梦幻西游亏的钱怎么办 普惠卡销户了钱存进去了怎么办 梦幻西游现金变储备了怎么办 孩子挣了钱存不下怎么办 电脑显示副本不是正版怎么办 斗战神师徒一个人删除角色怎么办