您的位置:首页 > 理论基础 > 计算机网络

赠送 HttpClient 和HttpURLConnection 的轻型网络框架 ---》使用介绍

2014-12-05 15:44 603 查看
转载注明出处:http://blog.csdn.net/codingandroid/article/details/41748007

之前看网上的一些网络框架,多少存在一些bug,大多还没有源码,有些有源码,框架过于太大,发现了bug修改起来也实在费事,所以使用自己的网络框架是最佳选择哦,这个框架我这里有借鉴一些其他框架的地方,不过提供功能就是   post  请求网络。

Android使用 HttpClient 和 HttpURLConnection,当然他们都存在一些缺陷,自己通过socket去写http协议稍显得麻烦,暂时先用着吧。

简单说说HttpClient 和 HttpURLConnection  这两个玩意儿的缺陷  Android 下使用DefaultHttpClient 去访问网络经常会报一个  NoHttpResponseException
这玩意儿简单看来好像本地资源不够用,导致线程被杀死了,细看,妹的,老子就开一个应用,资源绰绰有余,再细细去搜,就知道那个是DefaultHttpClient的一个缺陷,当然大家都说DefaultHttpClient缺陷很多,暂时也就不多列了,这个是最让我头疼的,有人说那么这个既然不能用,那么就果断换成HttpURLConnection这个就行啦,那么问题来了,测试过程中如果够细心你会发现一个叫 EOFException
这个的异常,难道是流木有关闭??折腾半天后可以发现,这个是HttpUrlConnection 的一个缺陷,当然网上也会有不少的解决方法,我把那些方法都加上了,还是偶然会出现这个异常,那先不管了,我想这个有时间必须要自己写一个,哎。目前在两个框架里我加了一些处理,还是出现这个异常的话,那对不起了,抓住后抛出一个timeout的异常就当超时处理了

下面简单介绍一下这个框架

将请求  解析数据,请求成功后的处理和失败后处理都分开,集中处理异常,请求都放到线程池中,当退出一个页面的时候,将这个页面没有没有结束的线程都结束掉,节省一些资源等等,之后会作一一的介绍

好了,下面看看如何这个框架的代码

package com.clxu.netframe;

import java.util.HashMap;

import org.json.JSONException;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.clxu.netframe.base.NetworkBaseActivity;
import com.clxu.netframe.constant.Constant;
import com.clxu.netframe.exception.MyException;
import com.clxu.netframe.net.AsyncUrlConnectionPost;
import com.clxu.netframe.net.callback.ParseCallback;
import com.clxu.netframe.net.callback.ResultCallback;
import com.clxu.netframe.util.LogUtil;

/***
* @function 轻型网络框架使用
*
* @author CLXU
*
* 2014-12-5
*/
public class MainActivity extends NetworkBaseActivity implements OnClickListener {
TextView text;
Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.tv_test);
button = (Button) findViewById(R.id.bt_test);

text.setText("这里展示测试数据");
button.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_test:
text.setText("这里展示测试数据");
doRequest();
break;

default:
break;
}

}

/***
* 这里是调用的示范
*/
private void doRequest(){
String url = "http://192.168.131.211/epapp/apk/version_inspection.json";
HashMap<String, String> map = new HashMap<String, String>();//初始化一个map对象
map.put("user_id", ""); //存入数据
map.put("user_pwd", "");
if (!TextUtils.isEmpty(url)) {
//  AsyncUrlConnectionPost 将这个类名改为  AsyncHttpClientPost 这个 就是使用 HttpClient执行 post方法了
AsyncUrlConnectionPost asyncBaseRequest = new AsyncUrlConnectionPost(url,
map, new ParseCallback() {
@Override
public Object parse(String json)
throws JSONException {
//这里对数据进行解析  至于使用XML 还是 json  还是直接使用的数据,我就不操心了,看你具体的需求
//把解析完的数据return 出去

LogUtil.d("return message="+json);
return json;
}
}, new ResultCallback() {
@Override
public void onSuccess(final Object obj) {
//这里的  obj  就是之前   pause 方法解析后  return 的数据

LogUtil.d("onSuccess message="+obj.toString());
runOnUiThread(new Runnable() {
public void run() {
text.setText(obj.toString());
}
});
}

@Override
public void onFail(final MyException e) {
//这边是各种异常,可以捕获处理
runOnUiThread(new Runnable() {
@Override
public void run() {
if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_IOEXCEPTION_CODE){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_SOCKET_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_CONNECT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_TIMEOUT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_PERRMIT_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}else if(e.getErrorCode() == Constant.NETWORK_REQUEST_UNKNOWN_EXCEPTION){
Toast.makeText(getApplicationContext(), e.getErrorMsg(), Toast.LENGTH_SHORT).show();
}
}
});
}
});
mDefaultThreadPool.execute(asyncBaseRequest);
mAsyncRequests.add(asyncBaseRequest);
}
}
}


使用的时候很简单哦 NetworkBaseActivity就继承这个基类就Ok了。





后面会对这个框架进行解剖分析

框架下载地址:http://download.csdn.net/detail/brightshadow11111/8228287



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息