android-async-http开源框架可以是我们轻松的获取网络数据或者向服务器发送数据,使用起来也很简单,下面做简单介绍,具体详细使用看官网:https://github.com/loopj/android-async-http
原文地址:http://blog.csdn.net/zhaoyazhi2129/article/details/26983259
引用开源框架通过AsyncHttpClient处理get/post请求
一、引用开源框架方法。
方法一
找到下载文件的源码,Com包黏贴到项目中的src目录下
方法二
引入jar包到libs下
二、引用开源框架发送get请求给服务器步骤:
1.创建异步请求端对象
2.发送get请求,(get请求参数含义:请求的url地址;异步请求的handler)
3.在成功请求里(status:状态返回码,headers:头部请求信息,responseBody返回结果)设置控件内容
三、引用开源框架发送post请求给服务器步骤
1.创建异步请求端对象
2.发送post请求,(get请求参数含义:请求的url地址;异步请求的handler)
3.封装请求参数
4.在成功请求里(status:响应状态码,headers:响应头信息,responseBody相应内容的字节码)设置控件内容
补充:
查看帮助文档我们知道,在post方法中传递参数时候可以创建RequestParams的对象,put进你所想要赋的值。如下图:
实例解析:当用户登录时,在界面输出用户是否登录成功
运行结果
项目实现
1.布局文件:同login布局文件
http://blog.csdn.net/zhaoyazhi2129/article/details/26509763
2.在AndroidManifest.xml添加internet权限
3.LoginActivity的代码(代码中详细加了注释,请仔细阅读)
package com.example.android_httpasync;
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;
/**
* 通过开源框架AsyncHttpClient的get/post请求处理
* @author zhaoyazhi
*
*/
public class MainActivity extends Activity {
private EditText et_username;
private EditText et_password;
private TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
findView();
}
/**
* 查找控件
*/
public void findView() {
et_password = (EditText) findViewById(R.id.editpass);
et_username = (EditText) findViewById(R.id.editusername);
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:// 进行登录操作
// 获取用户名密码
final String userName = et_username.getText().toString();
final String userPass = et_password.getText().toString();
// 判断是否为空
if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
Toast.makeText(getApplicationContext(), "用户名或者密码不能为空", 0)
.show();
} else {
Toast.makeText(getApplicationContext(), "发送请求道服务器", 0).show();
// loginByAsyncHttpClientGet(userName, userPass);
loginAsyncHttpClientPost(userName, userPass);
}
break;
default:
break;
}
}
/**
* 通过开源框架AsyncHttpClient的post请求处理
* @param userName
* @param userPass
*/
private void loginAsyncHttpClientPost(final String userName,
final String userPass) {
// 发送请求到服务器
AsyncHttpClient client = new AsyncHttpClient();
String url = "http://172.16.237.144:8080/Login/LoginServlet";
// 创建请求参数
RequestParams params = new RequestParams();
params.put("username", userName);
params.put("userpass", userPass);
// 执行post方法
client.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
// 设置值
tv_result.setText(new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
// 打印错误信息
error.printStackTrace();
}
});
}
/**
* 通过开源框架AsyncHttpClient的get请求处理
* @param userName
* @param userPass
*/
private void loginByAsyncHttpClientGet(final String userName,
final String userPass) {
// 创建异步请求端对象
AsyncHttpClient client = new AsyncHttpClient();
String url = "http://172.16.237.144:8080/Login/LoginServlet?username="
+ userName + "&userpass=" + userPass;
// 发送get请求对象
client.get(url, new AsyncHttpResponseHandler() {
@Override
// statusCode:状态返回码,headers:头部请求信息,responseBody返回结果
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
tv_result.setText(new String(responseBody));
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
// 输出错误信息
error.printStackTrace();
}
});
}
}
为了加强我们理解,在onSuccess方法中加入一些测试语句:
在控制台输出结果如下:
jar文件资源:http://download.csdn.net/detail/zhaoyazhi2129/7400787
源码:http://download.csdn.net/detail/zhaoyazhi2129/7400799
http://blog.csdn.net/redarmy_chen/article/details/26980613
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();
}
});
}
}
package com.http;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
public class HttpUtil {
private static AsyncHttpClient client =new AsyncHttpClient(); //实例话对象
static
{
client.setTimeout(11000); //设置链接超时,如果不设置,默认为10s
}
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);
}
public static AsyncHttpClient getClient()
{
return client;
}
}
package com.http;
import java.io.File;
import java.io.FileOutputStream;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
public class MainActivity extends Activity {
private TextView textView; // 顶部textview
private ProgressDialog pDialog;
private TextView textView2; // 下面textview,显示获取的所有数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text);
textView2 = (TextView) findViewById(R.id.text2);
}
public void method1(View view) {
pDialog = ProgressDialog.show(this, "请稍等", "数据加载中");
String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?type=1&p=2&size=10"; // 一個獲取菜谱的url地址
HttpUtil.get(urlString, new AsyncHttpResponseHandler() {
public void onSuccess(String arg0) { // 获取数据成功会调用这里
pDialog.dismiss();
textView.setText("获取json数据成功,看下面");
textView2.setText(arg0);
Log.i("hck", arg0);
};
public void onFailure(Throwable arg0) { // 失败,调用
Toast.makeText(MainActivity.this, "onFailure",
Toast.LENGTH_LONG).show();
};
public void onFinish() { // 完成后调用,失败,成功,都要掉
};
});
}
public void method2(View view) {
String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?";
RequestParams params = new RequestParams(); // 绑定参数
params.put("type", "1");
params.put("p", "2");
params.put("size", "10");
HttpUtil.get(urlString, params, new JsonHttpResponseHandler() {
public void onSuccess(JSONArray arg0) { // 成功后返回一个JSONArray数据
Log.i("hck", arg0.length() + "");
try {
textView.setText("菜谱名字:"
+ arg0.getJSONObject(2).getString("name")); //返回的是JSONArray, 获取JSONArray数据里面的第2个JSONObject对象,然后获取名字为name的数据值
} catch (Exception e) {
Log.e("hck", e.toString());
}
};
public void onFailure(Throwable arg0) {
Log.e("hck", " onFailure" + arg0.toString());
};
public void onFinish() {
Log.i("hck", "onFinish");
};
public void onSuccess(JSONObject arg0) { //返回的是JSONObject,会调用这里
Log.i("hck", "onSuccess ");
try {
textView.setText("菜谱名字:"
+ arg0.getJSONArray("list").getJSONObject(0)
.getString("name"));
} catch (Exception e) {
Log.e("hck", e.toString());
}
};
});
}
public void method3(View view) {
String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?type=1&p=2&size=10";
HttpUtil.get(urlString, new JsonHttpResponseHandler() {
public void onSuccess(JSONObject arg0) {
try {
textView.setText("菜谱名字:"
+ arg0.getJSONArray("list").getJSONObject(1)
.getString("name"));
} catch (Exception e) {
Log.e("hck", e.toString());
}
};
});
}
public void method4(View view) {
String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?";
final RequestParams params = new RequestParams();
params.put("type", "1");
params.put("p", "2");
params.put("size", "10");
HttpUtil.get(urlString, params, new AsyncHttpResponseHandler() {
public void onSuccess(String arg0) {
try {
JSONObject jObject = new JSONObject(arg0);
textView.setText("菜谱名字:"
+ jObject.getJSONArray("list").getJSONObject(2)
.getString("name"));
Log.i("hck", params.getEntity().toString());
} catch (Exception e) {
}
};
});
}
public void method5(View view) {
String url = "http://f.hiphotos.baidu.com/album/w%3D2048/sign=38c43ff7902397ddd6799f046dbab3b7/9c16fdfaaf51f3dee973bf7495eef01f3b2979d8.jpg";
HttpUtil.get(url, new BinaryHttpResponseHandler() {
@Override
public void onSuccess(byte[] arg0) {
super.onSuccess(arg0);
File file = Environment.getExternalStorageDirectory();
File file2 = new File(file, "cat");
file2.mkdir();
file2 = new File(file2, "cat.jpg");
try {
FileOutputStream oStream = new FileOutputStream(file2);
oStream.write(arg0);
oStream.flush();
oStream.close();
textView.setText("可爱的猫咪已经保存在sdcard里面");
} catch (Exception e) {
e.printStackTrace();
Log.i("hck", e.toString());
}
}
});
}
}
参考:
http://blog.csdn.net/redarmy_chen/article/details/26980613
http://www.myexception.cn/operating-system/1666231.html
http://www.open-open.com/lib/view/open1369637365753.html
文章标签:
文章链接: Android开源框架android-async-http使用
站方声明: 除特别标注, 本站所有文章均为原创, 互联分享, 尊重版权, 转载请注明.