二、Android网络框架

##二、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());
      
  • 欢迎扫码按关注更多信息
    在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值