安卓基于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);
}
}