Android 谷歌 开源 通信框架 VOLLEY(一)

来源:互联网 发布:电脑日程提醒软件 编辑:程序博客网 时间:2024/05/19 00:55

  HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下)。
  一般来说,移动应用推荐使用 HTTP 协议,有很多优点:
  1. HTTP 发展成熟
  HTTP 几乎已经快成为一种通用的 Web 标准,Web Services、Open API 等等都是基于 HTTP 协议的。几乎所有数据的传输(多媒体、XML、JSON)都可以采用 HTTP。
  2. 后台复用
  因为很多应用,除了有移动端,还有Web端,甚至桌面端。Web 版中前后台交互,无论是页面请求还是AJAX 请求,都是采用标准 HTTP 协议。那么其他的客户端没有理由重新设计一套协议。
  3. HTML 5 应用
  现在不少移动产品都采用或者半采用 HTML 5 技术,那么和服务器的交互又回归到 AJAX 上。不用说,还是离不开 HTTP。

  对于TCP传输层协议使用——实时推送 socket长连接

  个人理解,移动端http通信经历了三代,原生SDK,封装框架,整合资源。 


这里写图片描述

一、框架背景

  第一章 我们从第一代的原生态http通信——第二代的封装类库——第三代的资源整合。通过比较不同通信方式的优缺点,了解什么是volley,为什么用volley,一层层揭开他的神秘之纱。

  1.原生SDK——HttpURLConnection
  HttpURLConnection是java的标准类,是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。  

public String userLogin(String username,String userpwd){          String urlPost = "http://xxx.com?username=" + username + "&userpwd = " + userpwd;          URL url = new URL(urlPost );          HttpURLConnection conn  = (HttpURLConnection)url.openConnection();         conn.setRequestMethod("POST");          conn.connect();         InputStream  is = conn.getInputStream();        String s = StreamTools.readInputStream(is);          return s;      }  

  优点:
  (1).API简单,容易使用和扩展;
  (2).压缩,体积小减少网络访问的流量;
  (3).速度快,较省电。

  缺点:
  (1).原始,封装性差;
  (2).重访问自定义不方便。
  (3).android2.2 前bug多 (一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了)
  
  2.原生SDK——HttpClient
  HttpClient是Apache开源子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,封装了访问http的请求头,参数,内容体,响应等等。  

    public String userLogin(String username,String userpwd){          HttpClient client = new DefaultHttpClient();          String urlPost = "http://xxx.com";          HttpPost httpPost = new HttPost(urlPost);          List<NameValuePair> params = new ArrayList<NameValuePair>();              params.add(new BasicNameValuePair("username", username));              params.add(new BasicNameValuePair("userpwd", userpwd));          HttpResponse response = client.execute(httpPost);          if(200 == response.getStatusLine().getStatusCode()){              InputStream is = response.getEntity().getContent();              String s = StreamTools.readInputStream(is);              return s;          } else {              return null;          }          }  

  优点:
  (1).拥有众多的API;
  (2).实现比较稳定;
  (3).bug数量也很少;
  (4).web页面访问Session、Cookie的处理方便。

  缺点:
  (1).API数量过多,升级和扩展难;
  (2).Android团队在提升和优化HttpClient不积极。

  在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。而HttpURLConnection处理session比较麻烦。

注意:原生态使用
这里写图片描述
(1)AsyncTask
android轻量级的异步类,继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
优点:
l 简单,快捷
l 过程可控
缺点:
l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

(2)Handler
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)thread(子线程)运行并生成Message-Looper获取Message并传递给Handler,Handler逐个获取Looper中的Message,并进行UI变更。
优点:
l 结构清晰,功能定义明确
l 对于多个后台任务时,简单,清晰
缺点:
l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

原生SDK,简单易掌握,但是如果不进行封装,容易写出冗余代码。
这个时候,网络通信框架应运而生。 

  3.封装框架——AsyncHttpClient
  在Android开发中,发送、处理http请求简直太常见了,以至于我们的代码里到处充斥着各种HttpClient和与之相关又臭又长的代码。AsyncHttpClient,把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。
  AsyncHttpClient 是一个框架提供的库 可以异步传输。针对Android在Apache的HttpClient基础上构建的异步的callback-based。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。  

public String userLogin(String username,String userpwd) {      AsyncHttpClient client = new AsyncHttpClient();       RequestParams params = new RequestParams();      params.put("username", username);      params.put("userpwd", userpwd);      client.get("http://xxx.com", params, new  AsyncHttpResponseHandler() {            public void onSuccess(int statusCode, Header[] headers, String response) {                //处理返回来的信息                String s = StreamTools.readInputStream(response);                  return s;            }             public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {                Log.d("ERROR", error);            }            }     ); }

(1). 创建一个AsyncHttpClient;
(2). (可选的)通过RequestParams对象设置请求参数;
(3). 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。

但是没有图片下载接口

  4.封装框架——Universal-Image-Loader
  一个开源的图片异步加载类库,该项目的目的是提供一个可重复使用的类库为异步图像加载,缓存和显示。它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关
心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
这里写图片描述

Universal-Image-Loader两种处理图片的方式:
(1)loadimage
这里写图片描述
  DisplayImageOptions,他可以配置一些图片显示的选项,比如图片在加载中ImageView显示的图片,是否需要使用内存缓存,是否需要使用文件缓存等等。在回调方法onLoadingComplete()中将loadedImage设置到ImageView上面就行了。

(2)displayImage
这里写图片描述
  displayImage()比使用loadImage()方便很多,也不需要添加ImageLoadingListener接口,我们也不需要手动设置ImageView显示Bitmap对象,直接将ImageView作为参数传递到displayImage()中就行了,图片显示的配置选项中,我们添加了一个图片加载中ImageVIew上面显示的图片,以及图片加载出现错误显示的图片。

不提供简单http通信接口

  5.整合框架——Volley
  这里写图片描述
  Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片.
  这里写图片描述
  在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。特别适合处理数据量不大,但网络通信频繁,图文应用.
这里写图片描述

3 0
原创粉丝点击