##二、Android网络框架##

  • HttpClient框架:由Apache组织开发的网络访问的开源框架,谷歌将其分装到了Android中
  • 发送get请求
创建一个客户端对象

HttpClient hc = new DefaultHttpClient();

创建一个get请求对象
String path="http://192.168.10.03/web/servlet/CheckLogin?name="+URLEncoder.encode(name)+"&pass="+pass;
HttpGet hg = new HttpGet(path);

发送get请求,建立连接,返回响应头对象

HttpResponse hr = hc.execute(hg);

获取状态行对象,获取状态码,如果为200则说明请求成功

if(hr.getStatusLine().getStatusCode() == 200){
	//拿到服务器返回的输入流
	InputStream is = hr.getEntity().getContent();
	String text = Utils.getTextFromStream(is);
}
  • 发送post请求
//创建一个客户端对象
HttpClient client = new DefaultHttpClient();
//创建一个post请求对象
String path="http://192.168.10.03/web/servlet/CheckLogin";
HttpPost hp = new HttpPost(path);

往post对象里放入要提交给服务器的数据

//要提交的数据以键值对的形式存在BasicNameValuePair对象中
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
NameValuePair bnvp = new BasicNameValuePair("name", name);
NameValuePair bnvp2 = new BasicNameValuePair("pass", pass);
parameters.add(bnvp);
parameters.add(bnvp2);

//创建实体对象,指定进行URL编码的码表
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");
//为post请求设置实体
hp.setEntity(entity);
HttpResponse hr=hc.execute(hp);

if((hr.getStatusLine().getStatusCode())==200){
	InputStream is=hr.getEntity().getContent();
	String text=Utils.getTextFormStream(is);
	Message msg=handler.obtainMessage();
	msg.obj=text;
	handler.sendMessage(msg);
}
  • 异步HttpClient框架:民间人士对HttpClient进行进一步的封装,在github上下载AsyncHttpClient,可以将其library文件夹下的代码直接拷贝到src下(直接复制com文件夹即可),也可将library作为库文件。
  • 发送get请求
//创建异步的httpclient对象
AsyncHttpClient ahc = new AsyncHttpClient();
//发送get请求
ahc.get(path, new MyHandler());
注意AsyncHttpResponseHandler两个方法的调用时机

class MyHandler extends AsyncHttpResponseHandler{

	//http请求成功,返回码为200,系统回调此方法
	@Override
	public void onSuccess(int statusCode, Header[] headers,
			//responseBody的内容就是服务器返回的数据
			byte[] responseBody) {
		Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
	
	}

	//http请求失败,返回码不为200,系统回调此方法
	@Override
	public void onFailure(int statusCode, Header[] headers,
			byte[] responseBody, Throwable error) {
		Toast.makeText(MainActivity.this, "返回码不为200", 0).show();
	
	}

}
  • 发送post请求
使用RequestParams对象封装要携带的数据

//创建异步httpclient对象
AsyncHttpClient ahc = new AsyncHttpClient();
//创建RequestParams封装要携带的数据
RequestParams rp = new RequestParams();
rp.add("name", name);
rp.add("pass", pass);
//发送post请求
ahc.post(path, rp, new MyHandler());

//MyHandler对象与上面get相同
  • xUtils框架的使用参考:RobinWiki/开源项目的使用/xutils框架
    HttpUtils本身就支持多线程断点续传,使用起来非常的方便
    创建HttpUtils对象
HttpUtils http = new HttpUtils();

下载文件

http.download(url, //下载请求的网址
		target, //下载的数据保存路径和文件名
		true, //是否开启断点续传
		true, //如果服务器响应头中包含了文件名,那么下载完毕后自动重命名
		new RequestCallBack<File>() {//侦听下载状态
	
	//下载成功此方法调用
	@Override
	public void onSuccess(ResponseInfo<File> arg0) {
		tv.setText("下载成功" + arg0.result.getPath());
	}
	
	//下载失败此方法调用,比如文件已经下载、没有网络权限、文件访问不到,方法传入一个字符串参数告知失败原因
	@Override
	public void onFailure(HttpException arg0, String arg1) {
		tv.setText("下载失败" + arg1);
	}
	
	//在下载过程中不断的调用,用于刷新进度条
	@Override
	public void onLoading(long total, long current, boolean isUploading) {
		super.onLoading(total, current, isUploading);
		//设置进度条总长度
		pb.setMax((int) total);
		//设置进度条当前进度
		pb.setProgress((int) current);
		tv_progress.setText(current * 100 / total + "%");
	}
});
  • json文件的解析
  • 可以使用Android自带的API解析json文件
简单的json文件
{"versionName":"3.0",
"versionCode":2,
"description":"更新了什么,修复了什么",
"downloadUrl":"http://www.robinliew.com"}


InputStream in=conn.getInputStream();
String result=StreamUtils.readFromStream(in);
			
			
JSONObject jo=new JSONObject(result);
mversionname=jo.getString("versionName");
mversioncode=jo.getInt("versionCode");
mdescription=jo.getString("description");
mdownloadurl=jo.getString("downloadUrl");

定义工具类
public class StreamUtils {
	public static String readFromStream(InputStream in) throws IOException{
		ByteArrayOutputStream out=new ByteArrayOutputStream();

		byte[] buf=new byte[1024];
		int len=0;
		while((len=in.read(buf))!=-1){
			out.write(buf,0,len);
		}
	String result=out.toString();
	in.close();
	out.close();
	return result;
	}
}
  • github上Gson框架进行解析
Gson gson=new Gson();

//NewsData类是分装json文件数据的JavaBean,但不需要设置set、get方法,
//只需要保持该类中的字段名称与json文件中保存的键值对的键的名字完全相同即可
NewsData data = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:"+data.toString());