android 网络 实现,Android网络通信的根本实现

Android网络通信的基本实现

似乎很久没有写博客了,今天看了无意间看了下半年前写的代码,设计似乎很有局限性,但基本的通信也算是实现了。

不知道以后看到现在写的代码会不会也会有这样的想法呢?

进入正题,android网络通信的基本实现的有两种方式,一种是通过HttpClient来实现,一种是通过HttpURLConnection来实现。

直接上代码:

首先是一个抽象的http类

/**

* 抽象的Http

* @author Jenly

* @date 2014-8-7

*

*/

public abstract class AbstractHttp {

/** 默认编码 (UTF-8) */

public static final String DEFAULT_ENCODING = "UTF-8";

/** GET请求时 url和 参数的分隔符 */

public static final String URL_AND_PARA_SEPARATOR = "?";

/** 是否取消请求 */

protected boolean isCancel = false;

public static final int DEFAULT_BYTE_LENGTH = 8192;

protected static final int LONG_TIME = 0;

protected int connectionTimeOut = LONG_TIME;

protected int soTimeOut = LONG_TIME;

public enum HttpMethod{

/** GET请求 */

GET,

/** POST请求 */

POST

}

/**

* 构造

*/

public AbstractHttp(){

super();

}

public AbstractHttp(int connectionTimeOut,int soTimeOut){

super();

if(connectionTimeOut<0 || soTimeOut <0){

throw new RuntimeException("connectionTimeOut<0 || soTimeOut<0");

}

if(connectionTimeOut>0)

this.connectionTimeOut = connectionTimeOut;

if(soTimeOut>0)

this.soTimeOut = soTimeOut;

}

//-----------------------------------------

/**

* 取消请求

*/

protected void cancel(){

isCancel = true;

}

/**

* 异步线程

* @param runnable

*/

protected void asyncThread(Runnable runnable){

new Thread(runnable).start();

}

/**

* 异步连接 默认GET请求

* @param url

* @param httpEntity

* @param httpCallBack

*/

public abstract void asyncConnect(String url,HttpCallBack httpCallBack);

/**

* 异步连接 默认GET请求

* @param url

* @param httpEntity

* @param httpCallBack

*/

public abstract void asyncConnect(String url,Map params,HttpCallBack httpCallBack);

/**

* 异步连接

* @param url

* @param httpEntity

* @param httpMethod

* @param httpCallBack

*/

public abstract void asyncConnect(String url,Map params,HttpMethod httpMethod,HttpCallBack httpCallBack);

/**

* 同步连接 默认GET请求

* @param url

* @param httpEntity

* @param httpCallBack

*/

public abstract String syncConnect(String url);

/**

* 同步连接 默认GET请求

* @param url

* @param httpEntity

*/

public abstract String syncConnect(String url,Map params);

/**

* 同步连接 默认GET请求

* @param url

* @param httpEntity

* @param httpMethod

*/

public abstract String syncConnect(String url,Map params,HttpMethod httpMethod);

/**

* 同步连接 默认GET请求

* @param url

* @param httpEntity

* @param httpCallBack

*/

public abstract String syncConnect(String url,Map params,HttpCallBack httpCallBack);

/**

* 同步连接

* @param url

* @param httpEntity

* @param httpMethod

* @param httpCallBack

*/

public abstract String syncConnect(String url,Map params,HttpMethod httpMethod,HttpCallBack httpCallBack);

/**

* 异步下载文件

* @param url

* @param fileName

* @param httpDownloadCallBack

* @return

*/

public abstract void asyncDownloadFile(String url,String fileName,HttpCallBack httpDownloadCallBack);

/**

* 同步下载文件

* @param url

* @param fileName

* @return

*/

public abstract File syncDownloadFile(String url,String fileName);

/**

* 同步下载文件

* @param url

* @param fileName

* @param httpDownloadCallBack

* @return

*/

public abstract File syncDownloadFile(String url,String fileName,HttpCallBack httpDownloadCallBack);

}

监听回调接口:

/**

* Http连接回调接口

* @author Jenly

* @date 2014-8-7

*/

public interface HttpCallBack{

/**

* 开始

* @param url

*/

void onStart(String url);

/**

* 加载…

* @param progress

* @param count

*/

void onLoading(long progress,long count);

/**

* 成功

* @param t 返回的对象

*/

void onSuccess(T t);

/**

* 失败

* @param error

* @param e

*/

void onFailure(String error,Throwable e);

/**

* 取消

*/

void onCancel();

}

/**

* Http连接请求回调

* @author Jenly

* @date 2014-8-7

*/

public abstract class HttpConnectCallBack implements HttpCallBack{

@Override

public abstract void onSuccess(String content);

}

/**

* Http下载回调

* @author Jenly

* @date 2014-8-7

*/

public abstract class HttpDownloadCallBack implements HttpCallBack{

@Override

public abstract void onSuccess(File file);

}

通过HttpClient实现的方式

/**

* Http网络通信(httpClient实现)

* @author Jenly

* @date 2014-8-7

*/

public class Http extends AbstractHttp{

public Http() {

super();

}

public Http(int connectionTimeOut, int soTimeOut) {

super(connectionTimeOut, soTimeOut);

}

/**

* 获得一个HttpClient

* @return

*/

private HttpClient getHttpClient(){

HttpParams httpParams = new BasicHttpParams();

if(connectionTimeOut != LONG_TIME && soTimeOut != LONG_TIME){

HttpConnectionParams.setConnectionTimeout(httpParams,connectionTimeOut);

HttpConnectionParams.setSoTimeout(httpParams, soTimeOut);

}

HttpConnectionParams.setTcpNoDelay(httpParams, true);

HttpConnectionParams.setSocketBufferSize(httpParams,DEFAULT_BYTE_LENGTH);

HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);

SchemeRegistry schemeRegistry = new SchemeRegistry();

schemeRegistry.register(new Scheme("http", PlainSocketFactory

.getSocketFactory(), 80));

schemeRegistry.register(new Scheme("https", SSLSocketFactory

.getSocketFactory(), 443));

ThreadSafeClientConnManager threadSafeClientConnManager = new ThreadSafeClientConnManager(

httpParams, schemeRegistry);

return new DefaultHttpClient(threadSafeClientConnManager,httpParams);

}

/**

* 获得HttpUriRequest

* @param url

* @param httpMethod

* @param params

* @return

*/

private HttpUriRequest getHttpUriRequest(String url,HttpMethod httpMethod,Map params){

if(HttpMethod.POST == httpMethod){

HttpPost httpPost = new HttpPost(url);

if(params!=null){

List list = new ArrayList();

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

list.add(new BasicNameValuePair(key, params.get(key)));

}

try {

httpPost.setEntity(new UrlEncodedFormEntity(list,DEFAULT_ENCODING));

} catch (UnsupportedEncodingException e) {

LogUtils.e(e);

}

}

return httpPost;

}else{

if(params!=null){

List list = new ArrayList();

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

list.add(new BasicNameValuePair(key, params.get(key)));

}

url += URL_AND_PARA_SEPARATOR;

url += URLEncodedUtils.format(list,DEFAULT_ENCODING);

}

LogUtils.v("GET:"+ url);

HttpGet httpGet = new HttpGet(url);

return httpGet;

}

}

@Override

public void asyncConnect(String url,HttpCallBack httpCallBack) {

asyncConnect(url, null, HttpMethod.GET, httpCallBack);

}

@Override

public void asyncConnect(String url, Map params,HttpCallBack httpCallBack) {

asyncConnect(url, params, HttpMethod.GET, httpCallBack);

}

@Override

public void asyncConnect(final String url,final Map params,final HttpMethod httpMethod,final HttpCallBack httpCallBack) {

asyncThread(new Runnable(){

@Override

public void run() {

syncConnect(url, params,httpMethod, httpCallBack);

}

});

}

@Override

public String syncConnect(String url) {

return syncConnect(url, null, HttpMethod.GET, null);

}

@Override

public String syncConnect(String url, Map params) {

return syncConnect(url, params, HttpMethod.GET, null);

}

@Override

public String syncConnect(String url, Map params,HttpCallBack httpCallBack) {

return syncConnect(url, params, HttpMethod.GET, httpCallBack);

}

@Override

public String syncConnect(String url, Map params,HttpMethod httpMethod) {

return syncConnect(url, params,httpMethod, null);

}

@Override

public String syncConnect(String url, Map params,HttpMethod httpMethod,HttpCallBack httpCallBack) {

if(TextUtils.isEmpty(url)){

return null;

}

BufferedReader reader = null;

HttpClient httpClient = null;

int statusCode = -1;

try {

LogUtils.v(url);

if(httpCallBack != null)

httpCallBack.onStart(url);

HttpUriRequest request = getHttpUriRequest(url,httpMethod,params);

httpClient = getHttpClient();

HttpResponse httpResponse = httpClient.execute(request);

statusCode = httpResponse.getStatusLine().getStatusCode();

if(statusCode==HttpStatus.SC_OK){

reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));

StringBuffer buffer = new StringBuffer();

String line = null;

long progress = 0;

long count = httpResponse.getEntity().getContentLength();

isCancel = false;

if(httpCallBack != null && count!=-1)

httpCallBack.onLoading(progress, count);

while ((!isCancel) && (line = reader.readLine())!=null) {

buffer.append(line);

if(httpCallBack != null && count!=-1){

progress+= line.getBytes().length;

httpCallBack.onLoading(progress, count);

}

}

if(httpCallBack != null){

if(!isCancel){

progress = count;

httpCallBack.onLoading(progress, count);

}else{

reader.close();

httpCallBack.onCancel();

return null;

}

}

reader.close();

if(httpCallBack != null && !isCancel)

httpCallBack.onSuccess(buffer.toString());

if(httpClient!=null)

httpClient.getConnectionManager().shutdown();

return buffer.toString();

}else{

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode), null);

}

} catch (ClientProtocolException e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode),e);

} catch (IOException e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode),e);

}catch (Exception e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode),e);

}finally{

if(httpClient!=null)

httpClient.getConnectionManager().shutdown();

}

return null;

}

@Override

public void asyncDownloadFile(final String url,final String fileName,final HttpCallBack httpDownloadCallBack) {

asyncThread(new Runnable() {

@Override

public void run() {

syncDownloadFile(url,fileName,httpDownloadCallBack);

}

});

}

@Override

public File syncDownloadFile(String url,String fileName) {

return syncDownloadFile(url, fileName, null);

}

public File syncDownloadFile(String url,String fileName,HttpCallBack httpDownloadCallBack) {

if(TextUtils.isEmpty(url)){

return null;

}

File file = null;

BufferedInputStream bis = null;

FileOutputStream fos = null;

HttpClient httpClient = null;

int statusCode = -1;

try {

LogUtils.v(url);

if(TextUtils.isEmpty(fileName)){

return null;

}

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onStart(url);

HttpUriRequest httpUriRequest = getHttpUriRequest(url, HttpMethod.GET, null);

httpClient = getHttpClient();

HttpResponse httpResponse = httpClient.execute(httpUriRequest);

statusCode = httpResponse.getStatusLine().getStatusCode();

if(statusCode == HttpStatus.SC_OK){

file = new File(fileName);

fos = new FileOutputStream(file);

long progress = 0;

long count = httpResponse.getEntity().getContentLength();

bis = new BufferedInputStream(httpResponse.getEntity().getContent());

isCancel = false;

byte[] buffer = new byte[DEFAULT_BYTE_LENGTH];

int len = 0;

if(httpDownloadCallBack!=null && count!=-1)

httpDownloadCallBack.onLoading(progress, count);

long time = System.currentTimeMillis();

while((!isCancel) && (len = bis.read(buffer))!=-1){

fos.write(buffer, 0, len);

long temp = System.currentTimeMillis();

if(temp-time>=1000){

time = temp;

if(httpDownloadCallBack!=null && count!=-1){

progress += len;

httpDownloadCallBack.onLoading(progress, count);

}

}

}

if(httpDownloadCallBack!=null ){

if(!isCancel){

progress = count;

httpDownloadCallBack.onLoading(progress, count);

}else{

bis.close();

fos.close();

httpDownloadCallBack.onCancel();

if(httpClient!=null)

httpClient.getConnectionManager().shutdown();

return file;

}

}

bis.close();

fos.close();

if(httpDownloadCallBack!=null && !isCancel)

httpDownloadCallBack.onSuccess(file);;

}else{

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), null);

}

} catch (ClientProtocolException e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

e.printStackTrace();

} catch (IOException e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

e.printStackTrace();

}catch (Throwable e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

}finally{

if(httpClient!=null)

httpClient.getConnectionManager().shutdown();

}

return file;

}

}

通过HttpURLConnection实现的方式:

/**

* Http网络通信(HttpURLConnection实现)

* @author Jenly

* @date 2014-8-7

*/

public class KingHttp extends AbstractHttp{

public KingHttp() {

super();

}

public KingHttp(int connectionTimeOut, int soTimeOut) {

super(connectionTimeOut, soTimeOut);

}

private HttpURLConnection getHttpURLConnection(String url,HttpMethod httpMethod,Map params) throws MalformedURLException, IOException{

String paras = null;

if(params!=null){

List list = new ArrayList();

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

list.add(new BasicNameValuePair(key, params.get(key)));

}

paras = URLEncodedUtils.format(list, DEFAULT_ENCODING);

}

if(HttpMethod.GET ==httpMethod && paras!=null){

url += URL_AND_PARA_SEPARATOR;

url += paras;

}

HttpURLConnection httpURLConnection = (HttpURLConnection)new URL(url).openConnection();

httpURLConnection.setConnectTimeout(connectionTimeOut);

httpURLConnection.setReadTimeout(soTimeOut);

httpURLConnection.setUseCaches(false);

if(HttpMethod.POST ==httpMethod){

httpURLConnection.setDoOutput(true);

httpURLConnection.setRequestMethod("POST");

LogUtils.v("POST:"+ url);

if(paras!=null)

httpURLConnection.getOutputStream().write(paras.getBytes());

}else{

httpURLConnection.setRequestMethod("GET");

LogUtils.v("GET:"+ url);

}

return httpURLConnection;

}

@Override

public void asyncConnect(String url, HttpCallBack httpCallBack) {

asyncConnect(url, null, httpCallBack);

}

@Override

public void asyncConnect(String url, Map params,

HttpCallBack httpCallBack) {

asyncConnect(url, params, HttpMethod.GET, httpCallBack);

}

@Override

public void asyncConnect(final String url,final Map params,

final HttpMethod httpMethod,final HttpCallBack httpCallBack) {

asyncThread(new Runnable() {

@Override

public void run() {

syncConnect(url, params, httpMethod, httpCallBack);

}

});

}

@Override

public String syncConnect(String url) {

return syncConnect(url, null);

}

@Override

public String syncConnect(String url, Map params) {

return syncConnect(url, params, HttpMethod.GET);

}

@Override

public String syncConnect(String url, Map params,

HttpMethod httpMethod) {

return syncConnect(url, params, httpMethod, null);

}

@Override

public String syncConnect(String url, Map params,

HttpCallBack httpCallBack) {

return syncConnect(url, params, HttpMethod.GET, httpCallBack);

}

@Override

public String syncConnect(String url, Map params,

HttpMethod httpMethod, HttpCallBack httpCallBack) {

if(TextUtils.isEmpty(url)){

return null;

}

BufferedReader reader = null;

HttpURLConnection httpURLConnection = null;

int statusCode = -1;

try {

LogUtils.v(url);

if(httpCallBack!=null){

httpCallBack.onStart(url);

}

httpURLConnection = getHttpURLConnection(url,httpMethod,params);

httpURLConnection.connect();

statusCode = httpURLConnection.getResponseCode();

if(statusCode==HttpURLConnection.HTTP_OK){

reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

StringBuffer buffer = new StringBuffer();

String line = null;

long progress = 0;

long count = httpURLConnection.getContentLength();

isCancel = false;

if(httpCallBack != null && count!=-1)

httpCallBack.onLoading(progress, count);

while ((!isCancel) && (line = reader.readLine())!=null) {

buffer.append(line);

if(httpCallBack != null && count!=-1){

progress+= line.getBytes().length;

httpCallBack.onLoading(progress, count);

}

}

if(httpCallBack != null){

if(!isCancel){

progress = count;

httpCallBack.onLoading(progress, count);

}else{

reader.close();

httpCallBack.onCancel();

return null;

}

}

reader.close();

if(httpCallBack != null && !isCancel)

httpCallBack.onSuccess(buffer.toString());

if(httpURLConnection!=null)

httpURLConnection.disconnect();

return buffer.toString();

}else{

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode), null);

}

} catch (MalformedURLException e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode), e);

} catch (IOException e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode), e);

} catch (Exception e) {

LogUtils.e(e);

if(httpCallBack != null)

httpCallBack.onFailure(String.valueOf(statusCode), e);

}finally{

if(httpURLConnection!=null){

httpURLConnection.disconnect();

}

}

return null;

}

@Override

public void asyncDownloadFile(final String url,final String fileName,

final HttpCallBack httpDownloadCallBack) {

asyncThread(new Runnable() {

@Override

public void run() {

syncDownloadFile(url,fileName,httpDownloadCallBack);

}

});

}

@Override

public File syncDownloadFile(String url, String fileName) {

return syncDownloadFile(url, fileName, null);

}

@Override

public File syncDownloadFile(String url, String fileName,

HttpCallBack httpDownloadCallBack) {

if(TextUtils.isEmpty(url)){

return null;

}

File file = null;

BufferedInputStream bis = null;

FileOutputStream fos = null;

HttpURLConnection httpURLConnection = null;

int statusCode = -1;

try {

LogUtils.v(url);

if(TextUtils.isEmpty(fileName)){

return null;

}

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onStart(url);

httpURLConnection = getHttpURLConnection(url,HttpMethod.GET,null);

httpURLConnection.connect();

statusCode = httpURLConnection.getResponseCode();

if(statusCode == HttpURLConnection.HTTP_OK){

file = new File(fileName);

fos = new FileOutputStream(file);

long progress = 0;

long count = httpURLConnection.getContentLength();

bis = new BufferedInputStream(httpURLConnection.getInputStream());

isCancel = false;

byte[] buffer = new byte[DEFAULT_BYTE_LENGTH];

int len = 0;

if(httpDownloadCallBack!=null && count!=-1)

httpDownloadCallBack.onLoading(progress, count);

long time = System.currentTimeMillis();

while((!isCancel) && (len = bis.read(buffer))!=-1){

fos.write(buffer, 0, len);

long temp = System.currentTimeMillis();

if(temp-time>=1000){

time = temp;

if(httpDownloadCallBack!=null && count!=-1){

progress += len;

httpDownloadCallBack.onLoading(progress, count);

}

}

}

if(httpDownloadCallBack!=null ){

if(!isCancel){

progress = count;

httpDownloadCallBack.onLoading(progress, count);

}else{

bis.close();

fos.close();

httpDownloadCallBack.onCancel();

if(httpURLConnection!=null)

httpURLConnection.disconnect();

return file;

}

}

bis.close();

fos.close();

if(httpDownloadCallBack!=null && !isCancel)

httpDownloadCallBack.onSuccess(file);;

}else{

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), null);

}

} catch (ClientProtocolException e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

} catch (IOException e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

}catch (Throwable e) {

LogUtils.e(e);

if(httpDownloadCallBack!=null)

httpDownloadCallBack.onFailure(String.valueOf(statusCode), e);

}finally{

if(httpURLConnection!=null)

httpURLConnection.disconnect();

}

return file;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值