一、

在Android中,发送和处理http请求实在太常见了,以至于我们经常需要写这方面的代码。

Android中网络交互的代码不能在UI线程中执行,只能在额外的子线程中执行。

我一般的做法是通过创建子线程和Handler来完成,网络交互的代码在线程中执行,交互的结果通过Handler反馈给UI线程。

new Thread(){
public void run() {
//http请求的发送与接收代码
//将操作接口通过handler通知页面
};
}.start();

还有一种交互的方式是通过回调函数callback来实现。

二、

发现了一个网络交互的库:android-async-http,前段时间尝试着用了一下,感觉挺棒的。

这个库,他网络交互的代码都已经封装在里面,通常一个http请求只需要简单的几行代码即可完成。

它与UI交互的方式是通过回调函数callback来实现,内容比较完成,其中网络交互的开始,结束,成功,失败,进度等等都可以通过callback得到

第一步:得到httpclient对象

AsyncHttpClient client = new AsyncHttpClient(); //这一步可以我们自己封装成单例模式

第二步:发送get请求

client.get(url.toString(), responseHandler);

//这个地方的responseHandler,假如我们需要得到这个请求的相关返回值,就需要重写实现这个类,并且重写其中的方法;假如不需要的话,使用null代替即可
JsonHttpResponseHandler responseHandler = new JsonHttpResponseHandler(){
public void onSuccess(int statusCode, org.apache.http.Header[] headers, org.json.JSONObject response) {
super.onSuccess(statusCode, headers, response);
}; public void onFailure(int statusCode, org.apache.http.Header[] headers, Throwable throwable, org.json.JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable,
};
@Override
public void onFinish() {
super.onFinish();
};
     //还有很多其他可以重写的方法,基本包括交互过程中所有的状态
}

三、

觉得这个库写的很棒,各种高大上,简单的读了一下其中的源码,他在github上是开源的。

每一个请求,都被封装在一个runnable中,执行这个请求的时候,ExecutorService.submit(runnable)将该runnable放在线程池中执行

根据用户提供的网络路径和键值对,创建HttpUriRequest对象,通过HttpResponse response = client.execute(HttpUriRequest, httpContext)来执行网络操作

HttpUriRequest,它是一个接口,它有多个子类,其中包含HttpEntityEnclosingRequestBase;HttpEntityEnclosingRequestBase包含setURI()和setEntity(HttpEntity entity) 的方法。

请求发送之后,该方法会返回一个叫RequestHandle的对象,通过该对象的cancel方法,可以实现取消请求的方法

这里只是对库里面的主要方法进行描述,其中还有很多其他的内容,比如gzip,比如base64等等

四、

包含的功能:

1. 发送异步http请求,在匿名callback对象中处理response;
 
2. http请求发生在UI线程之外;
 
3. 内部采用线程池来处理并发请求;
 
4. GET/POST 参数构造,通过RequestParams类。
 
5. 内置多部分文件上传,不需要第三方库支持;
 
6. 流式Json上传,不需要额外的库;
 
7. 能处理环行和相对重定向;
 
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
 
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
 
10. 自动的gzip响应解码;
 
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
 
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
 
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
 
14. 支持SAX解析器;
 
15. 支持各种语言和content编码,不仅仅是UTF-8。

android 网络交互的更多相关文章

  1. android网络交互之DNS优化知识整理

    android网络交互之DNS优化知识整理 之前的工作中,经常会遇到DNS解析出问题导致网络交互的操作无法正常进行. UnknownHostException 在很多的移动开发过程中,与服务端的交互的 ...

  2. Android 网络交互之MD5为什么要加盐

    MD5为什么要加盐 之前面试的时候,遇到一个面试的哥哥.不停的跟我确认我对网络传输过程中的password进行MD5加密的时候,是否加key了. 当时我很纳闷,因为MD5本身已经是不可逆的了,需要破解 ...

  3. Android 网络交互之下载断点续传

    一.概述 1.概念 断点续传主要用于下载,本文也主要讲述下载时的断点续传的逻辑思路.顾名思义,断点续传就是下载从中断的地方继续下载,一般是因为暂停或者网络故障导致的下载中断,当恢复下载的时候可以从已经 ...

  4. Android 网络交互之移动端与服务端的加密处理

    在开发项目的网络模块时,我们为了保证客户端(Client)和服务端(Server)之间的通信安全,我们会对数据进行加密. 谈到网络通信加密,我们可以说出:对称加密,非对称加密,md5单向加密,也能提到 ...

  5. Servlet和Android网络交互基础(3)

    在上一章中採用了最简单的创建service端代码方式,但在实际开发中一般都会採用比較成熟的框架.以下是完整的maven+spring mvc 创建service的方式 下载安装Eclipse 和jdk ...

  6. SSM + Android 网络文件上传下载

    SSM + Android 网络交互的那些事 2016年12月14日 17:58:36 ssm做为后台与android交互,相信只要是了解过的人都知道一些基本的数据交互,向json,对象,map的交互 ...

  7. Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例

    前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...

  8. Android网络请求框架

    本篇主要介绍一下Android中经常用到的网络请求框架: 客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据 请求的参数,返回客户端需要的数据,经过网络 ...

  9. 6、android 网络编程

    1.基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s  ...

随机推荐

  1. 如何通过java反射将数据库表生成实体类?

    首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有 ...

  2. STL之stack(栈)

    栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(First In Last Out, FILO).栈只有一个出口,允许新增元素(只能在栈顶上增加).移出元素(只能移出栈顶 ...

  3. unity之uv贴图画圆弧,圆弧面,不规则图形

    由于最近一直没有时间,所以这篇博客一直没发,下面我说说uv画圆弧,圆面,不规则面拼接. 先来两张效果图 图截的不咋滴,凑合着看吧,画圆弧主要用的贝塞尔曲线画的,我感觉这个比较简单,当然大家也可以使用圆 ...

  4. Nginx 之一:编译安装nginx 1.8.1 及配置

    一:基介绍 官网地址www.nginx.org,nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间 ...

  5. CreateThread与_beginthread, _beginthreadex创建线程的基本概念和区别(1)

    这三个函数都可以创建新的线程,但都是如何创建的呢?当然MSDN文档最权威: Creates a thread to execute within the virtual address space o ...

  6. mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

  7. JQuery实现表格的相同单元格合并的三种方法

    代码: <!DOCTYPE html> <html> <head> <title>merge.html</title> <meta h ...

  8. jvm Classload method介绍

    1,jvm Classload默认几个重要方法介绍 findClass:Finds and loads the class with the specified name from the URL s ...

  9. arduino电子琴(2015-11-04)

    前言 这是论坛上一个坛友问的问题,想做一个可变音调的电子琴,想着正好练练手,就顺手做一下. 接线图

  10. Tomcat日志catalina.out文件过大的处理方法

    原文地址:http://lcbk.net/tomcat/1396.html 我们知道一般企业使用Tomcat 作为Web端时,它产生的日志会越来越大,特别是catalina.out这个日志文件,然而有 ...