android-async-http
Android-async-http开源项目可以Overview(概况)
An asynchronous callback-based Http client for Android built on top of Apache’s HttpClient libraries. All requests are made outside of your app’s main UI thread, but any callback logic will be executed on the same thread as the callback was created using Android’s Handler message passing.
译文:
异步基于回调的Http客户端为Android构建,是基于Apache HttpClient库的。所有的请求都是位于应用程序主线程 UI 之外,但任何回调逻辑将相同的线程上执行回调,使用Android的处理程序创建消息传递。
1.2 Features(特征)
- Make asynchronous HTTP requests, handle responses in HTTP requests happen Requests use a 请求使用threadpool,限制并发资源使用情况
-
GET/POST
GET / POST参数构建使用(RequestParams)
-
Multipart 文件上传,没有额外的第三方库
-
Tiny size overhead to your application, only
在你的应用程序上利用很小的开销,仅仅25 kb就可以做一切
- Automatic smart request retries optimized for spotty mobile connections
-
自动智能请求重试,优化了质量不一的移动连接
-
Automatic
自动解码支持gzip反应速度超快的请求
-
Binary file (images etc) downloading with
Built-in response parsing into JsonHttpResponseHandler
持久化cookie存储,保存cookie到你的应用程序的SharedPreferences
2.Installation & Basic Usage(安装和基本用法)
Download the latest .jar file from github and place it in your Android app’s folder.
从github上下载最新的最新的jar文件.并将其放置在你的Android应用程序的libs /文件夹.
2.1下载方式:
1.从http://loopj.com/android-async-http/的页面下载
点击DownLoad即可下载最新的jar文件
2.从https://github.com/loopj/android-async-http的页面下载
找到DownLoad ZIP进行下载文件,解压后的目录如下
examples:里面有简单的例子
library:里面存放的是android-async-http开源项目的源码(方法一:可以把library\src\main\Java文件下面的文件拷贝到,你应用的src下也可以直接使用)
releases:里面存放的是各个版本的jar文件,(方法二:只需把最新的jar文件拷贝到你应用的libs目录下即可.)
samples:里面存放的也是例子(可供参考)
根据08_android入门_android-async-http开源项目介绍及使用方法的介绍,我们通过最常见的登陆案例进行介绍Android-async-http开源项目中有关类的使用.希望对你学习android-async-http开源项目有所帮助.
1.继续采用03_android入门_采用RelativeLayout实现登陆界面为该案例的布局文件
2.服务器端的代码采用04_android入门_采用HttpURLConnection的GET方式实现登陆案例中的服务器代码片段(5.关于服务器中我仅写一个Servlet进行处理相应的请求处理)
3.在应用中引用android-async-http开源项目
方法一:找到下载文件的源码library\src\main\Java的com包黏贴到项目中的src目录下
方法二:把android-async-http-master\releases下面最新的jar包放到应用到libs下
4.LoginActivity的代码(代码中详细加了注释,请仔细阅读)
package com.example.lesson03; import org.apache.http.Header; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class LoginActivity extends Activity { // 声明控件 private EditText et_name, et_pass; private TextView tv_result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取控件对象 et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); tv_result = (TextView) findViewById(R.id.tv_result); } /** * 点击按钮控件触发的事件 * @param v */ public void login(View v) { //获取控件的id int id = v.getId(); //根据id判断进行相应的处理 switch (id) { case R.id.btn_login: // 获取控件的文本内容 String userName = et_name.getText().toString();// 用户名 String userPass = et_pass.getText().toString();// 用户密码 //判断用户名和密码是否为空 if (TextUtils.isEmpty(userName.trim()) || TextUtils.isEmpty(userPass.trim())) { Toast.makeText(this, "用户名或者密码不能为空", Toast.LENGTH_LONG).show(); } else { // 发送请求给服务器 //调用:loginByAsyncHttpClientPost(userName, userPass); loginByAsyncHttpClientGet(userName, userPass); } break; } } /** * 采用AsyncHttpClient的Post方式进行实现 * @param userName * @param userPass */ public void loginByAsyncHttpClientPost(String userName, String userPass) { AsyncHttpClient client = new AsyncHttpClient(); // 创建异步请求的客户端对象 String url = "http://172.16.237.200:8080/video/login.do"; // 定义请求的地址 // 创建请求参数的封装的对象 RequestParams params = new RequestParams(); params.put("username", userName); // 设置请求的参数名和参数值 params.put("userpass", userPass);// 设置请求的参数名和参数 // 执行post方法 client.post(url, params, new AsyncHttpResponseHandler() { /** * 成功处理的方法 * statusCode:响应的状态码; headers:相应的头信息 比如 响应的时间,响应的服务器 ; * responseBody:响应内容的字节 */ @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if (statusCode == 200) { tv_result.setText(new String(responseBody)); // 设置显示的文本 } } /** * 失败处理的方法 * error:响应失败的错误信息封装到这个异常对象中 */ @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { error.printStackTrace();// 把错误信息打印出轨迹来 } }); } /** * 采用AsyncHttpClient的Get方式进行实现 * @param userName * @param userPass */ public void loginByAsyncHttpClientGet(String userName, String userPass) { // 创建异步的客户端对象 AsyncHttpClient client = new AsyncHttpClient(); // 请求的地址 String url = "http://172.16.237.200:8080/video/login.do"; // 创建请求参数的封装的对象 RequestParams params = new RequestParams(); params.put("username", userName); // 设置请求的参数名和参数值 params.put("userpass", userPass);// 设置请求的参数名和参数 // 发送get请求的时候 url地址 相应参数,匿名回调对象 client.get(url, params,new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // 成功处理的方法 System.out .println("statusCode-------------------" + statusCode); // 遍历头信息 for (int i = 0; i < headers.length; i++) { Header header = headers[i]; System.out.println("header------------Name:" + header.getName() + ",--Value:" + header.getValue()); } // 设置控件内容 tv_result.setText(new String(responseBody)); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // 失败处理的方法 error.printStackTrace(); } }); } }