文档章节

学习笔记:异步http开源框架android-async-http的使用

吴新超
 吴新超
发布于 2015/02/13 16:15
字数 1702
阅读 166
收藏 1
点赞 0
评论 0

 接着昨天的笔记,昨天的笔记我们讲到了两种面向HTTP协议发送GET/POST请求的方式,并对比了两种方式的源码还有GET/POST参数的不同,我们说到,这两种方式都是需要三步来完成:1,开启一个子线程;2,编写http请求逻辑传递/获取数据;3,让UI线程更新界面.
托管在GITHUB上的开源框架就直接实现了这三个步骤的包装,我们需要做的只是传递几个参数和获取数据后进行处理即可:我们先通过GET请求的源码实现,然后再略微讲解下这个框架底层的实现方式:
 
图片

以上是loginByAsyncGet()方法是布局中的一个按钮的点击事件,我们可以看到在这个点击事件的逻辑代码中,我们并没有开启一个新的线程处理网络操作,也没有sendMessage去告知消息处理器处理UI更新,我们所做的只有:
1,初始化一个AsyncHttpClient
2,调用它的get()方法,并且重新它的onSuccess()处理返回数据即可.
仅仅两步操作即完成了我们上一篇笔记中的http请求.
从上面的get()方法传递的参数一个path路径,一个自定义的Hadler我们可以 模拟出它底层的简单实现:
首先我们也创建了一个AsyncHttpClient类,里面写了一个get方法:
get方法中做了以下操作:
传递一个请求路径和一个我们自定义的Handler,在Get方法中开一个新的线程,并将路径访问网络操作成功或者失败分别返回不同的结果告诉我们自己写的MyHandler处理:重写
Handler的handleMessage()方法,判断msg.what是成功还是失败,成功:调用onSuccess()方法,失败:调用onFailure()方法.
以下是GET方法:
图片
 以下是我们自定义的MyHandler:
图片 

 所以我们使用我们自己写的
AsyncHttpClient类访问网络时也只需要这样操作即可:
 图片

模拟
android-async-http简单的 GET请求的实现原理就是这样的.接下来我们同样看android-async-http实现异步POST请求的方式
实现代码:
图片
在POST请求中我们同样先初始化一个AsyncHttpClient,然后调用他的post()方法即可
我们在参数中看到一个RequestParams类型的参数,它是像HashMap一样以键值对方式将post的请求参数放进去,然后传给服务器进行接收,RequestParams中除了可以放一般类型的参数外,还可以放置File文件类型进行文件的上传,一会儿我们再讲如何通过这个框架实现手机文件上传到服务器,onSuccess中和GET请求一样返回的是三个参数,这三个参数:
第一个statusCode是(200,503,404)等的请求响应码,
第二个headers中存放的是response的消息头,包括了他的编码方式等内容
第三个参数responseBody就是response中的内容了,我们在服务器中doPost()请求中模拟了成功后得到的数据

PrintWriter out=response.getWriter();

out.write("login success");

responseBody的内容即是"login success"
好了通过
android-async-http框架进行一般的http服务器请求就是这么简单,我们再来看如何使用这个开源框架进行文件的上传,如果要自己写一个文件上传单单通过apache 的httpClient也可以实现,但是代码量特别大,而且非常容易出错,这个框架就已经包装了这些繁琐的操作,我们只需要关心它的实现方式就OK!
我们为了方便,再写一个servlet作为文件上传的服务器,将手机上传的文件放到电脑E盘的文件夹中去
先做一个网页上传的测试并截取一些参数来看看上传文件需要配置哪些参数:
服务端代码,通过org.apache.commons.fileupload实现上传:
图片 
上传浏览器端截取的参数:
 图片
我们可以看到他的connent-type和它的上传文件参数是需要以一定格式进行编写的, 
android-async-http底层代码中就对这些--和/t /n做了包装,我们只要直接调用即可实现上传:代码

图片
图片
我们看到上面的方式和我们 之前的POST方式一模一样,只是在RequestParams中放置的参数类型变成了File,我们试着将手机中的一个文件上传到电脑,
我这里就将以前做手机备份APP时备份的手机短信上传到服务器并在控制台打印参数中的headers:

图片

图片

文件上传成功:
图片


 好了,对于android-async-http这个开源框架的入门操作就讲这些,其它更高级的应用大家可以去GITHUB下载这个框架的源码其中他给了这个框架的API手册,可以通过API实现你想要的操作.
这里讲一个小插曲,细心的人应该可以看到,为什么我这个应用可以上传我手机另外一个应用下的短信文件?因为这个小细节,在调试的时候把我绕了好久,我的模拟器当时不知道因为什么,SD卡无法配置上去,(现在已经解决 ),所以我想到之前做手机备份软件时将备份的短信存在了那个应用目录下,所以我就想直接去上传那个文件夹下的XML短信文件,结果传了半天一直报错,起初一直是以为servlet服务端没写好,后来怎么查代码都感觉没问题,结果叮一下就想到应用之间是不能直接访问文件的,必须要通过对方内容提供者去让对方处理这些事情,所以为了方便,我就直接去改了那个应用包下这个文件的权限.....所以才能访问,大家千万别犯这种2B错误...应用之间是不能直接访问对方数据的:附上犯罪记录:
 图片

好了今天的日志就这些,接下来就要开始讲ACTIVITY了,非常重要的Android基础!这个讲完基本上就可以讲点开源框架,然后再学点控件使用,就可以风风火火的进行开发了,像相机的调用啊,应用程序的国际化,图形,多媒体播放器等等,都可以直接看示例代码了去使用.



© 著作权归作者所有

共有 人打赏支持
吴新超
粉丝 2
博文 8
码字总数 13585
作品 0
海盐
程序员
async-http-client开源库学习笔记(一)

文前闲话 作为一个Android开发的大龄初学者,面对扑面而来的各种姿势的Android的开源组件,让人倍感窒息,难以应对。无奈为了养家糊口,虽然已近不惑,人老珠黄,也只能废寝忘食,逐个体位细...

马丁当 ⋅ 2015/08/19 ⋅ 3

retrofit,okhttp

Android RxJava+Retrofit2+RxBinding RxJava+Retrofit2+RxBinding 笔记 MVP + Rxjava + Retrofit 构建项目 2015 年最值得 Android 程序猿去学习的就是 RxJava 了,关于 RxJava 就不再多描述了......

掘金官方 ⋅ 01/11 ⋅ 0

六款值得推荐的android(安卓)开源框架简介【转】

1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求...

hkstar35 ⋅ 2014/07/11 ⋅ 0

六款值得推荐的android(安卓)开源框架简介【转】

1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求...

火蚁 ⋅ 2014/07/09 ⋅ 1

Android 开源框架

1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求...

SRain215 ⋅ 2015/11/30 ⋅ 0

android-async-http框架库使用基础

开源项目链接 android-async-http仓库:git clone https://github.com/loopj/android-async-http android-async-http主页:http://loopj.com/android-async-http/ 背景知识 开始使用分析前还......

xiahuawuyu ⋅ 2015/12/22 ⋅ 0

android仿IT之家、炫酷水波纹、Kotlin MVP项目、后台模拟点击、蜂巢迷宫小游戏等源码

Android精选源码 Android 炫酷的多重水波纹源码(http://www.apkbus.com/thread-598586-1-1.html) Android开发一款基于行为识别和个性化推荐的智能推荐APP(http://www.apkbus.com/thread-5985...

逆鳞龙 ⋅ 05/02 ⋅ 0

smart-ioc 首版发布:为 Android 打造的国产 NIO 通信框架

项目背景 在几年前作者便开始NIO的学习与研究,并在码云上提交了第一个作品smart-socket(NIO版)。本来期望将其打造成异步非阻塞的通信框架,如同netty一样,却最终效果并不理想。恰逢Java ...

三刀蜀黍 ⋅ 05/28 ⋅ 13

答CsdnBlogger问-关于安卓入行和开发问题

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:请问大牛对功能和框架的认识有哪些?(提问者:执笔记忆的空白) 比如对于一个小公司来说,什么样的框架最适用,您经...

liuzxgeek ⋅ 2016/09/21 ⋅ 0

github上的NB Android项目

最近想捣鼓捣鼓Android,下了Oschina的android client source,看得挺舒服的,写得很清晰,受益匪浅,想再深入了解下,当然是接着看优秀开源项目咯。google到CSDN上的“直接拿来用,最火的A...

pengzai ⋅ 2013/05/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 18分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 24分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 26分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 35分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 38分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 今天 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部