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;
}
}