代码已经上传到github,欢迎Star。

一个自己封装的用HttpUrlConnection请求的网络工具类,但只适合新手研究或者做些小demo用下, 毕竟现在对于Android开发的网络框架有很多,而且很好很强大。

目前支持的功能:

1、GET,POST请求

2、支持返回String,Byte[]数组,以及自定义的Model类

3、请求的回调已处理过,现在的回调在UI线程,所以可以直接更新UI

同样的,如果写demo啥的,可以按照以下方式依赖进项目:

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

dependencies {

compile 'com.github.MZCretin:HttpUrlConnectionUtilDemo:v1.0'

}

后面如果有需要,我会加上下载文件的方法。

如果有啥问题,欢迎交流:

792075058

正文

最近吃腻了外卖,想着自己做饭吃,所以就自己做了一个菜谱的小软件,从api服务上找了一个菜谱的接口就开始做了,在做的过程中,需要请求一个接口,来获取菜谱信息,于是就想到Android现在很火的各种网络框架。。。在选择的时候就犯难了,我就写个软件自己用,就简单的请求一个接口,有必要用这么重的框架么。然后就开始了主题所说的自定义一个简单的网络加载工具类。

我这边只是做了一个简单的封装。

首先:定义一个 static ExecutorService threadPool = Executors.newCachedThreadPool(),来创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。因为不能在主线程请求网络,所以用这个线程池来装载我们用于进行网络请求的线程,定义一个static Gson gson = new Gson();用来将请求的json数据转换成对应的Model对象。

然后:定义第一个方法,也就是返回字符串的方法。在这个方法里,上面有关HttpURLConnection的操作都是一样的,不一样的是最后对流的处理,这个方法要求返回的是字符串,所以我们在获取到流的时候将其转化成我们需要的字符串,再通过回调给调用者,其他goGet方法也一样,如果需要byte数组,我们就返回byte数组,如果需要对象,我们就先转成String字符串,然后通过gson将json字符串转换成对应的对象返回即可。(具体请看源码,下面会贴出源码)

doGet方法

/**

* GET方法 返回数据会解析成字符串String

* @param context 上下文

* @param urlString 请求的url

* @param listener 回调监听

*/

public static void doGet(final Context context, final String urlString,

final HttpCallbackStringListener listener) {

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

// 根据URL地址创建URL对象

url = new URL(urlString);

// 获取HttpURLConnection对象

httpURLConnection = ( HttpURLConnection ) url.openConnection();

// 设置请求方式,默认为GET

httpURLConnection.setRequestMethod("GET");

// 设置连接超时

httpURLConnection.setConnectTimeout(5000);

// 设置读取超时

httpURLConnection.setReadTimeout(8000);

// 响应码为200表示成功,否则失败。

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(buffer.toString());

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 释放资源

httpURLConnection.disconnect();

}

}

}

});

}

上面讲了doGet方法的实现,其实doPost方法的实现除了需要带上参数列表之外其他都是是一样的。对于参数的处理,在我的开发经历中,参数都是放在Map容器中传递的,所以在这里也就使用的这种方式,对于传进来的参数,我们需要进行处理下,其实也就是字符串的拼接,拼接成HttpURLConnection能够识别的形式。下面的代码进行了参数的组织:

final StringBuffer out = new StringBuffer();

// 组织请求参数

for (String key : params.keySet()) {

if(out.length()!=0){

out.append("&");

}

out.append(key).append("=").append(params.get(key));

}

拼接好参数列表之后,我们通过httpURLConnection.getOutputStream()获取到PrintWriter,然后写入我们的参数信息即可。其他的操作跟get请求是一样的。

PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

// 发送请求参数

printWriter.write(out.toString());

// flush输出流的缓冲

printWriter.flush();

printWriter.close();

doPost方法

/**

* POST方法 返回数据会解析成字符串 String

* @param context 上下文

* @param urlString 请求的路径

* @param listener 回调监听

* @param params 参数列表

*/

public static void doPost(final Context context,

final String urlString, final HttpCallbackStringListener listener,

final Map params) {

final StringBuffer out = new StringBuffer();

// 组织请求参数

for (String key : params.keySet()) {

if(out.length()!=0){

out.append("&");

}

out.append(key).append("=").append(params.get(key));

}

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

url = new URL(urlString);

httpURLConnection = ( HttpURLConnection ) url.openConnection();

httpURLConnection.setRequestProperty("accept", "*/*");

httpURLConnection.setRequestProperty("connection", "Keep-Alive");

httpURLConnection.setRequestProperty("Content-Length", String

.valueOf(out.length()));

httpURLConnection.setRequestMethod("POST");

httpURLConnection.setConnectTimeout(5000);

httpURLConnection.setReadTimeout(8000);

// 设置运行输入

httpURLConnection.setDoInput(true);

// 设置运行输出

httpURLConnection.setDoOutput(true);

PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

// 发送请求参数

printWriter.write(out.toString());

// flush输出流的缓冲

printWriter.flush();

printWriter.close();

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(buffer.toString());

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 最后记得关闭连接

httpURLConnection.disconnect();

}

}

}

});

}

在上面的代码中,在请求的最后,我们会看到一个 new ResponseCall(context, listener).doSuccess(buffer.toString());这个是用来干嘛的呢?其实这个是用来进行子线程和主线程的数据交换的,定义一个Handler,不过Handler是通过looper来创建的,looper是通过传进来的上下文Context来获取主线程的looper,然后次Handler就是位于主线程的。当请求结束后,如果请求成功,则调用doSuccess(T response)方法,给Handler发送消息,消息的what值为0,消息的内容是请求的结果;请求失败或错误的时候,调用doFail(Exception e)方法,给Handler发送消息,消息的what值为1,消息的内容是请求失败的异常信息。当Handler收到消息之后,直接调用listener的回调方法,就可以一方面把数据回调回去,另一方面,回调也是处于主线程也就是UI线程了,这样调用者就可以直接在回调方法中更新UI了。

ResponseCall.java

/**

* Created by cretin on 2017/3/20.

*/

public class ResponseCall {

//用于在子线程和主线程的数据交换

Handler mHandler;

public ResponseCall(Context context, final HttpCallbackModelListener listener) {

Looper looper = context.getMainLooper();

mHandler = new Handler(looper) {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if ( msg.what == 0 ) {

//成功

listener.onFinish(msg.obj);

} else if ( msg.what == 1 ) {

//失败

listener.onError(( Exception ) msg.obj);

}

}

};

}

public ResponseCall(Context context, final HttpCallbackBytesListener listener) {

Looper looper = context.getMainLooper();

mHandler = new Handler(looper) {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if ( msg.what == 0 ) {

//成功

listener.onFinish(( byte[] ) msg.obj);

} else if ( msg.what == 1 ) {

//失败

listener.onError(( Exception ) msg.obj);

}

}

};

}

public ResponseCall(Context context, final HttpCallbackStringListener listener) {

Looper looper = context.getMainLooper();

mHandler = new Handler(looper) {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if ( msg.what == 0 ) {

//成功

listener.onFinish(msg.obj.toString());

} else if ( msg.what == 1 ) {

//失败

listener.onError(( Exception ) msg.obj);

}

}

};

}

public void doSuccess(T response) {

Message message = Message.obtain();

message.obj = response;

message.what = 0;

mHandler.sendMessage(message);

}

public void doFail(Exception e) {

Message message = Message.obtain();

message.obj = e;

message.what = 1;

mHandler.sendMessage(message);

}

}

下面是实际中的调用实例:

MainActivity.java

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.widget.TextView;

import com.cretin.www.httpurlconnectionutil.HttpUtils;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackBytesListener;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackModelListener;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackStringListener;

import com.cretin.www.httpurlconnectionutildemo.model.ResponseModel;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import java.util.HashMap;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final TextView tvContent = ( TextView ) findViewById(R.id.tv_content);

//测试GET请求

//返回字符串

try {

HttpUtils.doGet(this, "http://caipu.yjghost.com/index.php/query/read?menu=" + URLEncoder.encode("土豆", "UTF-8") + "&rn=15&start=1", new HttpCallbackStringListener() {

@Override

public void onFinish(String response) {

tvContent.setText(response);

}

@Override

public void onError(Exception e) {

tvContent.setText(e.toString());

}

});

} catch ( UnsupportedEncodingException e ) {

e.printStackTrace();

}

//返回byte数组

try {

HttpUtils.doGet(this, "http://caipu.yjghost.com/index.php/query/read?menu=" + URLEncoder.encode("土豆", "UTF-8") + "&rn=15&start=1", new HttpCallbackBytesListener() {

@Override

public void onFinish(byte[] response) {

Log.e("HHHHHHH", "GET 方法:" + new String(response));

}

@Override

public void onError(Exception e) {

Log.e("HHHHHHH", "doGet onError:" + e.toString());

}

});

} catch ( UnsupportedEncodingException e ) {

e.printStackTrace();

}

//返回对象

try {

HttpUtils.doGet(this, "http://caipu.yjghost.com/index.php/query/read?menu=" +

URLEncoder.encode("土豆", "UTF-8") + "&rn=15&start=1",

new HttpCallbackModelListener() {

@Override

public void onFinish(ResponseModel response) {

Log.e("HHHHHHH", "GET 方法:" + response.getResult().getTotalNum());

}

@Override

public void onError(Exception e) {

Log.e("HHHHHHH", "doGet onError:" + e.toString());

}

}, ResponseModel.class);

} catch ( UnsupportedEncodingException e ) {

e.printStackTrace();

}

//测试POST请求

//参数列表

Map map = new HashMap<>();

map.put("productFirstType", "1");

map.put("loanRange", "1");

map.put("type", "hot");

map.put("page", "1");

map.put("timeRange", "1");

//返回String

HttpUtils.doPost(this, "http://101.201.31.212:8016/product/listProduct", new HttpCallbackStringListener() {

@Override

public void onFinish(String response) {

Log.e("HHHHHHH", "POST 方法:" + response);

}

@Override

public void onError(Exception e) {

Log.e("HHHHHHH", "doPost onError:" + e.toString());

}

}, map);

//返回byte数组

HttpUtils.doPost(this, "http://101.201.31.212:8016/product/listProduct", new HttpCallbackBytesListener() {

@Override

public void onFinish(byte[] response) {

Log.e("HHHHHHH", "POST 方法:" + new String(response));

}

@Override

public void onError(Exception e) {

Log.e("HHHHHHH", "doPost onError:" + e.toString());

}

}, map);

//返回对象

HttpUtils.doPost(this, "http://101.201.31.212:8016/product/listProduct", new HttpCallbackModelListener() {

@Override

public void onFinish(ResponseModel response) {

Log.e("HHHHHHH", "POST 方法:" + response.getResult().getTotalNum());

}

@Override

public void onError(Exception e) {

Log.e("HHHHHHH", "doPost onError:" + e.toString());

}

}, map, ResponseModel.class);

}

}

下面贴出整个工具类的代码:

import android.accounts.NetworkErrorException;

import android.content.Context;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackBytesListener;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackModelListener;

import com.cretin.www.httpurlconnectionutil.callback.HttpCallbackStringListener;

import com.cretin.www.httpurlconnectionutil.response.ResponseCall;

import com.google.gson.Gson;

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Iterator;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* Created by cretin on 2017/3/22.

* HttpURLConnection 网络请求工具类

*

* 数据的请求都是基于HttpURLConnection的 请求成功与失败的回调都是在主线程

* 可以直接更新UI

*/

public class HttpUtils {

static ExecutorService threadPool = Executors.newCachedThreadPool();

static Gson gson = new Gson();

/**

* GET方法 返回数据会解析成字符串String

* @param context 上下文

* @param urlString 请求的url

* @param listener 回调监听

*/

public static void doGet(final Context context, final String urlString,

final HttpCallbackStringListener listener) {

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

// 根据URL地址创建URL对象

url = new URL(urlString);

// 获取HttpURLConnection对象

httpURLConnection = ( HttpURLConnection ) url.openConnection();

// 设置请求方式,默认为GET

httpURLConnection.setRequestMethod("GET");

// 设置连接超时

httpURLConnection.setConnectTimeout(5000);

// 设置读取超时

httpURLConnection.setReadTimeout(8000);

// 响应码为200表示成功,否则失败。

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(buffer.toString());

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 释放资源

httpURLConnection.disconnect();

}

}

}

});

}

/**

* GET方法 返回数据会解析成byte[]数组

* @param context 上下文

* @param urlString 请求的url

* @param listener 回调监听

*/

public static void doGet(final Context context, final String urlString,

final HttpCallbackBytesListener listener) {

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url = null;

HttpURLConnection httpURLConnection = null;

try {

// 根据URL地址创建URL对象

url = new URL(urlString);

// 获取HttpURLConnection对象

httpURLConnection = ( HttpURLConnection ) url.openConnection();

// 设置请求方式,默认为GET

httpURLConnection.setRequestMethod("GET");

// 设置连接超时

httpURLConnection.setConnectTimeout(5000);

// 设置读取超时

httpURLConnection.setReadTimeout(8000);

// 响应码为200表示成功,否则失败。

if ( httpURLConnection.getResponseCode() != 200 ) {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

} else {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

// 读取输入流中的数据

BufferedInputStream bis = new BufferedInputStream(is);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] bytes = new byte[1024];

int len = -1;

while ( (len = bis.read(bytes)) != -1 ) {

baos.write(bytes, 0, len);

}

bis.close();

is.close();

// 响应的数据

new ResponseCall(context, listener).doSuccess(baos.toByteArray());

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 释放资源

httpURLConnection.disconnect();

}

}

}

});

}

/**

* GET方法 返回数据会解析成cls对象

* @param context 上下文

* @param urlString 请求路径

* @param listener 回调监听

* @param cls 返回的对象

* @param 监听的泛型

*/

public static void doGet(final Context context,

final String urlString,

final HttpCallbackModelListener listener, final Class cls) {

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

// 根据URL地址创建URL对象

url = new URL(urlString);

// 获取HttpURLConnection对象

httpURLConnection = ( HttpURLConnection ) url.openConnection();

// 设置请求方式,默认为GET

httpURLConnection.setRequestMethod("GET");

// 设置连接超时

httpURLConnection.setConnectTimeout(5000);

// 设置读取超时

httpURLConnection.setReadTimeout(8000);

// 响应码为200表示成功,否则失败。

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(gson.fromJson(buffer.toString(), cls));

} else {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 释放资源

httpURLConnection.disconnect();

}

}

}

});

}

/**

* POST方法 返回数据会解析成字符串 String

* @param context 上下文

* @param urlString 请求的路径

* @param listener 回调监听

* @param params 参数列表

*/

public static void doPost(final Context context,

final String urlString, final HttpCallbackStringListener listener,

final Map params) {

final StringBuffer out = new StringBuffer();

// 组织请求参数

for (String key : params.keySet()) {

if(out.length()!=0){

out.append("&");

}

out.append(key).append("=").append(params.get(key));

}

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

url = new URL(urlString);

httpURLConnection = ( HttpURLConnection ) url.openConnection();

httpURLConnection.setRequestProperty("accept", "*/*");

httpURLConnection.setRequestProperty("connection", "Keep-Alive");

httpURLConnection.setRequestProperty("Content-Length", String

.valueOf(out.length()));

httpURLConnection.setRequestMethod("POST");

httpURLConnection.setConnectTimeout(5000);

httpURLConnection.setReadTimeout(8000);

// 设置运行输入

httpURLConnection.setDoInput(true);

// 设置运行输出

httpURLConnection.setDoOutput(true);

PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

// 发送请求参数

printWriter.write(out.toString());

// flush输出流的缓冲

printWriter.flush();

printWriter.close();

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(buffer.toString());

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 最后记得关闭连接

httpURLConnection.disconnect();

}

}

}

});

}

/**

* POST方法 返回数据会解析成Byte[]数组

* @param context 上下文

* @param urlString 请求的路径

* @param listener 回调监听

* @param params 参数列表

*/

public static void doPost(final Context context,

final String urlString, final HttpCallbackBytesListener listener,

final Map params) {

final StringBuffer out = new StringBuffer();

// 组织请求参数

for (String key : params.keySet()) {

if(out.length()!=0){

out.append("&");

}

out.append(key).append("=").append(params.get(key));

}

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

url = new URL(urlString);

httpURLConnection = ( HttpURLConnection ) url.openConnection();

httpURLConnection.setRequestProperty("accept", "*/*");

httpURLConnection.setRequestProperty("connection", "Keep-Alive");

httpURLConnection.setRequestProperty("Content-Length", String

.valueOf(out.length()));

httpURLConnection.setRequestMethod("POST");

httpURLConnection.setConnectTimeout(5000);

httpURLConnection.setReadTimeout(8000);

// 设置运行输入

httpURLConnection.setDoInput(true);

// 设置运行输出

httpURLConnection.setDoOutput(true);

PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

// 发送请求参数

printWriter.write(out.toString());

// flush输出流的缓冲

printWriter.flush();

printWriter.close();

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

// 读取输入流中的数据

BufferedInputStream bis = new BufferedInputStream(is);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] bytes = new byte[1024];

int len = -1;

while ( (len = bis.read(bytes)) != -1 ) {

baos.write(bytes, 0, len);

}

bis.close();

is.close();

// 响应的数据

new ResponseCall(context, listener).doSuccess(baos.toByteArray());

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 最后记得关闭连接

httpURLConnection.disconnect();

}

}

}

});

}

/**

* /**

* POST方法 返回数据会解析成cls对象

* @param context 上下文

* @param urlString 请求的路径

* @param listener 回调监听

* @param params 参数列表

* @param cls 对象

* @param 监听泛型

*/

public static void doPost(final Context context,

final String urlString, final HttpCallbackModelListener listener,

final Map params, final Class cls) {

final StringBuffer paramsStr = new StringBuffer();

// 组织请求参数

Iterator it = params.entrySet().iterator();

while ( it.hasNext() ) {

Map.Entry element = ( Map.Entry ) it.next();

paramsStr.append(element.getKey());

paramsStr.append("=");

paramsStr.append(element.getValue());

paramsStr.append("&");

}

if ( paramsStr.length() > 0 ) {

paramsStr.deleteCharAt(paramsStr.length() - 1);

}

// 因为网络请求是耗时操作,所以需要另外开启一个线程来执行该任务。

threadPool.execute(new Runnable() {

@Override

public void run() {

URL url;

HttpURLConnection httpURLConnection = null;

try {

url = new URL(urlString);

httpURLConnection = ( HttpURLConnection ) url.openConnection();

httpURLConnection.setRequestMethod("POST");

httpURLConnection.setConnectTimeout(5000);

httpURLConnection.setReadTimeout(8000);

// 设置运行输入

httpURLConnection.setDoInput(true);

// 设置运行输出

httpURLConnection.setDoOutput(true);

PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

// 发送请求参数

printWriter.write(paramsStr.toString());

// flush输出流的缓冲

printWriter.flush();

printWriter.close();

if ( httpURLConnection.getResponseCode() == 200 ) {

// 获取网络的输入流

InputStream is = httpURLConnection.getInputStream();

BufferedReader bf = new BufferedReader(new InputStreamReader(is, "UTF-8"));

//最好在将字节流转换为字符流的时候 进行转码

StringBuffer buffer = new StringBuffer();

String line = "";

while ( (line = bf.readLine()) != null ) {

buffer.append(line);

}

bf.close();

is.close();

new ResponseCall(context, listener).doSuccess(gson.fromJson(buffer.toString(), cls));

} else {

new ResponseCall(context, listener).doFail(

new NetworkErrorException("response err code:" +

httpURLConnection.getResponseCode()));

}

} catch ( MalformedURLException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} catch ( IOException e ) {

if ( listener != null ) {

// 回调onError()方法

new ResponseCall(context, listener).doFail(e);

}

} finally {

if ( httpURLConnection != null ) {

// 最后记得关闭连接

httpURLConnection.disconnect();

}

}

}

});

}

}

HttpCallbackBytesListener.java

/**

* HttpURLConnection网络请求返回监听器

*/

public interface HttpCallbackBytesListener {

// 网络请求成功

void onFinish(byte[] response);

// 网络请求失败

void onError(Exception e);

}

HttpCallbackModelListener.java

/**

* HttpURLConnection网络请求返回监听器

*/

public interface HttpCallbackModelListener {

// 网络请求成功

void onFinish(T response);

// 网络请求失败

void onError(Exception e);

}

HttpCallbackStringListener.java

/**

* HttpURLConnection网络请求返回监听器

*/

public interface HttpCallbackStringListener {

// 网络请求成功

void onFinish(String response);

// 网络请求失败

void onError(Exception e);

}

代码已经上传到github,欢迎Star。

我叫Cretin,一个可爱的小男孩。

php httputils,Android 自定义网络加载工具类 HttpURLConnectionUtils相关推荐

  1. android 海浪动画,android自定义波浪加载动画的实现代码

    本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下 效果图 1.自定义控件 WaveView package com.example.wh.myapplicati ...

  2. 简单的网络图片加载工具类

    简单的网络图片加载工具类 根据图片url网址解生成图片,首先解析图片的流信息,然后通过bitmapfactory工具类生成bitmap图片,设置到图片控件上即可,详情看代码 import androi ...

  3. Android 自定义ImageView加载图片

    自定义imageview功能: 可以实现设置图片显示的时候,依据本身的比例进行图片的缩放 加载图片效果: 使用ImageLoader来加载 图片: 首先将ImageLoader的jar包关联到项目中 ...

  4. android 自定义progressdialog,android自定义ProgressDialog加载效果

    用来记录自己所用到的知识 前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了一个加载中的logo图用来提高用户体验. 于是就在网上找了 ...

  5. android自定义图片加载,Android自定义ProgressDialog加载图片

    为了提高用户体验,我们肯定希望该Dialog能更加炫酷,让用户看着更舒服.那如何做呢,当然是我们自己定义一个ProgressDialog了. 一.使用系统加载框 mDialog = new Progr ...

  6. android 加载layout,Android自定义View加载视图之LoadingLayout

    介绍 上一篇博文写了一个通用的加载view,这篇在加载view的基础在包裹一层就是LoadingLayout了,主要的目的是免去每次加载时要隐藏主内容布局,然后加载成功之后显示主内容布局这些繁琐操作. ...

  7. android 自定义view 加载图片,Android自定义View基础开发之图片加载进度条

    学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了, ...

  8. Android 自定义进度加载动画

    偶尔浏览一个android开发网站,发现进度加载动画比较不错,觉得挺有意思 就自己参考了下自己做了一个进度加载动画 效果图如下: 首选来看自定义动画 package com.itzb.paintdem ...

  9. android 自定义图片加载动画效果,Android自定义加载动画-感染体

    Android自定义动画系列七,今天来分享第七个自定义Loading动画(InfectionBallBuilder),看上去感觉有种病毒源被感染的感觉,所以名字就叫感染体,这个动画做出来的效果,我不怎 ...

  10. Android自定义波浪加载圆形进度条——(自定义控件 一)

    2019独角兽企业重金招聘Python工程师标准>>> 自定义控件-- 波浪形状圆形进度加载 时间管理的基础是精力管理,精力的高低.正负分影响到我们的效率 而时间是无法管理的,能够管 ...

最新文章

  1. 互联网高并发架构设计模式
  2. MySQL里面json_MySQL中的JSON
  3. python插入排序_python 插入排序,选择排序
  4. java日期时间转日期_Java时间和日期指南
  5. python爬取知乎标题_python爬虫 爬取知乎文章标题及评论
  6. 改变css名称,样式命名规则?css
  7. 虚拟化时代 智能数据管理架构才是王道
  8. 字典树哇 AC自动机哇 = _ =
  9. 最新手机号段归属地数据库(2018年4月)
  10. 常见移动端兼容性问题
  11. 08python excel一键式统计0.11版本修正利息收入费用正负表达问题
  12. C2872 “detail”: 不明确的符号
  13. SEOer必读:50个网站推广方法
  14. springboot 删除路径下面所有文件_Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析...
  15. 【每日一句】名人金句学英语(20221130)
  16. 2008-2020年800+商业银行财务面板数据
  17. 基于Java的奖学金评定管理系统
  18. Error: @vitejs/plugin-vue requires vue (>=3.2.13) or @vue/compiler-sfc to be present in the dependen
  19. ogg转mp3格式转换器
  20. Vue项目在ie浏览器打不开的解决办法

热门文章

  1. 4. PHP 操作 memcache(1)
  2. 3. XML 树结构
  3. APT攻防整理-常用CVE
  4. WPF获取原始控件样式。
  5. 2017.10.16 模拟赛
  6. CodeForces 255C. Almost Arithmetical Progression (DP)
  7. 46.贪心算法练习:  区间合并
  8. java线程池ThreadPoolExecutor使用简介
  9. STL -- string类字符串
  10. android开发,assets下面的资源文件不会变化/改动