android-async-http开源网络框架是专门针对Android在Apache的基础上构建的异步且基于回调的http client。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。
android-async-http的特点:(这段摘自网络)
- Make asynchronous HTTP requests, handle responses in anonymous callbacks
- 进行异步HTTP请求,处理响应在匿名回调中完成
- HTTP requests happen outside the UI thread
- HTTP请求发生在UI线程之外
- Requests use a threadpool to cap concurrent resource usage
- 请求使用threadpool,限制并发资源使用情况
- GET/POST params builder (RequestParams)
- GET / POST参数构建使用(RequestParams)
- Multipart file uploads with no additional third party libraries
- Multipart 文件上传,没有额外的第三方库
- Tiny size overhead to your application, only 25kb for everything
- 在你的应用程序上利用很小的开销,仅仅25 kb就可以做一切
- Automatic smart request retries optimized for spotty mobile connections
- 自动智能请求重试,优化了质量不一的移动连接
- Automatic gzip response decoding support for super-fast requests
- 自动解码支持gzip反应速度超快的请求
- Binary file (images etc) downloading with BinaryHttpResponseHandler
- 二进制文件(图片等)的下载,使用BinaryHttpResponseHandler
- Built-in response parsing into JSON with JsonHttpResponseHandler
- 内置响应解析成JSON,使用JsonHttpResponseHandler
- Persistent cookie store, saves cookies into your app’s SharedPreferences
- 持久化cookie存储,保存cookie到你的应用程序的SharedPreferences
android-async-http开源库下载地址:https://github.com/loopj/android-async-http
基本用法:
将下载好的的android-async-http开源库压缩包解压,打开文件夹如下图所示:
打开"releases"文件夹,里面后各个版本的jar包。如图:
接着新建一个Android工程,取名为"zhj_async_http"。将1.4.5版本的jar包导入并添加到工程中,如图:
接下来就是敲代码了。
先来一个最简单的用法(请求百度页面):
Import the http package.
import com.loopj.android.http.*;
Create a new AsyncHttpClient instance and make a request:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.baidu.com", new
TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String response) {
System.out.println(response);
} @Override
public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
Log.d("ERROR", error);
}
}
);
整个步骤如下:
1、创建一个AsyncHttpClient对象。
2、用这个对象设置请求方式(包括get、put、post、head、delete)。
3、传入参数(包括请求地址、参数的设置、并指定一个ResponseHandlerInterface的实例接收请求结果)。
4、在onSuccess()方法中执行请求成功的操作,在onFailure()方法中执行请求失败的操作。
怎么样?是不是感觉很简单?
不过官方建议使用静态的方式,官方Demo:
import com.loopj.android.http.*; public class TwitterRestClient {
private static final String BASE_URL = "http://api.twitter.com/1/"; private static AsyncHttpClient client = new AsyncHttpClient(); public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
} public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
} private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
import org.json.*;
import com.loopj.android.http.*; class TwitterRestClientUsage {
public void getPublicTimeline() throws JSONException {
TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// If the response is JSONObject instead of expected JSONArray
} @Override
public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
// Pull out the first event on the public timeline
JSONObject firstEvent = timeline.get(0);
String tweetText = firstEvent.getString("text"); // Do something with the response
System.out.println(tweetText);
}
});
}
}
那么,现在来使用android-async-http开源框架来实现获取String字符串、Json格式的数据和网络图片。
首先根据官方建议使用static实现一个HttpUtil.java(目前只使用get请求方式):
public class HttpUtil { private static AsyncHttpClient client = new AsyncHttpClient(); // 实例话对象 static {
client.setTimeout(11000); // 设置链接超时,如果不设置,默认为10s
} public static AsyncHttpClient getClient() {
return client;
} public static void get(String urlString, AsyncHttpResponseHandler res) // 用一个完整url获取一个string对象
{
client.get(urlString, res);
} public static void get(String urlString, RequestParams params,
AsyncHttpResponseHandler res) // url里面带参数
{
client.get(urlString, params, res);
} public static void get(String urlString, JsonHttpResponseHandler res) // 不带参数,获取json对象或者数组
{
client.get(urlString, res);
} public static void get(String urlString, RequestParams params,
JsonHttpResponseHandler res) // 带参数,获取json对象或者数组
{
client.get(urlString, params, res);
} public static void get(String uString, BinaryHttpResponseHandler bHandler) // 下载数据使用,会返回byte数据
{
client.get(uString, bHandler);
} }
布局文件的实现:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/iv"
android:layout_width="300dp"
android:layout_height="300dp" /> <ScrollView
android:id="@+id/sl"
android:layout_width="match_parent"
android:layout_height="match_parent" > <TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</ScrollView> </LinearLayout>
接下来是MainActivity.java(三个方法分别是实现获取Json(包括JSONObject和JSONArray)、String、网络图像)
public class MainActivity extends Activity { private TextView tv;
private ImageView iv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
iv = (ImageView) findViewById(R.id.iv);
Json();
String();
image(); } private void image() { AsyncHttpClient client = new AsyncHttpClient();
client.get(
"http://b.hiphotos.baidu.com/zhidao/pic/item/d833c895d143ad4b08c2629580025aafa50f06f2.jpg",
new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
if (statusCode == 200) {
BitmapFactory factory = new BitmapFactory();
Bitmap bitmap = factory.decodeByteArray(
responseBody, 0, responseBody.length);
iv.setImageBitmap(bitmap);
}
} @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
error.printStackTrace();
}
}); } private void String() {
HttpUtil.get("http://www.baidu.com", new TextHttpResponseHandler() { @Override
public void onSuccess(int arg0, Header[] arg1, String arg2) {
tv.setText(arg2); } @Override
public void onFailure(int arg0, Header[] arg1, String arg2,
Throwable arg3) {
tv.setText("请求百度失败"); }
}); } private void Json() { HttpUtil.get("http://m.weather.com.cn/data/101010100.html",
new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
JSONObject response) {
// TODO Auto-generated method stub
super.onSuccess(statusCode, headers, response); if (statusCode == 200) {
try {
String str = response.getJSONObject(
"weatherinfo").getString("index_d");
tv.setText(str);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } else {
tv.setText("statusCode != 200");
} }
}); } }
运行结果如下图:
(左图是网络图像加String,右图是网络图像加Json数据)
参考博客:http://www.open-open.com/lib/view/open1369637365753.html
相关博客:http://www.cnblogs.com/angeldevil/p/3729808.html
官方文档:http://loopj.com/android-async-http/
代码比较简单就不附上DEMO了。
Android中android-async-http开源网络框架的简单使用的更多相关文章
-
Android中常用的优秀开源框架
Android开源框架库分类,挑选出最常用,最实用的开源项目,本篇主要介绍的是优秀开源框架库和项目,UI个性化控件会独立介绍.UI个性化控件 Index Dependency Injections A ...
-
Android中Universal Image Loader开源框架的简单使用
UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...
-
Android中使用http协议访问网络
HTTP协议的工作原理:客户端向服务器端发送http请求,服务器端收到请求后返回一下数据给客户端,客户端接受消息并进行解析. 在Android中发送http请求的方式有两种,第一种是通过HttpURL ...
-
在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
-
Android中关于JNI 的学习(四)简单的样例,温故而知新
在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...
-
Android中的AutoCompleteTextView(随笔提示文本)组件的简单使用
Android中的随笔提示文本组件AutoCompleteTextView的使用,此组件用于输入文本,然后就会在所配置的适配器中的数据进行查找显示在组件下面. 这里值得注意的是AutoComplete ...
-
Android中android:layout_alignParentBottom标签不生效
Android中一个奇怪的问题 Android 6.0中android:layout_alignParentBottom设置后不生效. 详见:https://code.google.com/p/and ...
-
Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
-
android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件
网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次 ...
随机推荐
-
JavaScript设计模式与开发实践 - 观察者模式
概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...
-
EL表达式隐含对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据. 语法:${隐式对象名称} :获得对象的引用 <%@ page lang ...
-
数据库文件导入导出操作,以及赋予权限SQL语句
1.导出数据库xxxx和tlog(经过测试,没有问题)# /data/mysql/bin/mysqldump -u root -ppassword qq9x | gzip > /home/xxx ...
-
jsp 之 解决 Mysql net start mysql启动,提示发生系统错误 5 拒绝访问的问题
在dos下运行net start mysql时 !!!提示发生系统错误 5:拒绝访问!只要切换到管理员模式就可以启动了. 所以我们要以管理员身份来运行cmd程序来启动mysql. 1.在开始菜单的搜索 ...
-
angularJS 路由加载js controller 未定义 解决方案
说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. 路由 $routeProvider 异步加载js 路由的基本用法,请查看 ...
-
jdk自动安装java_home 无法修改解决方法
使用命令行修改 cmd下set java_home=D:\soft\java\jdk1.7.0_72 搞定
-
Python+Selenium笔记(九):操作警告和弹出框
#之前发的 driver.switch_to_alert() 这句虽然可以运行通过,但是会弹出警告信息(这种写法3.x不建议使用) 改成 driver.switch_to.alert就不会了. (一 ...
-
005.基于docker部署etcd集群部署
一 环境准备 ntp配置:略 #建议配置ntp服务,保证时间一致性 etcd版本:v3.3.9 防火墙及SELinux:关闭防火墙和SELinux 名称 地址 主机名 备注 etcd1 172.24. ...
-
【CAS单点登录视频教程】 第04集 -- tomcat下配置https环境
目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...
-
dp之多重背包poj2392
题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度......... 思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好 ...