在前几篇文章中《Android 采用get方式提交数据到服务器》《Android 采用post方式提交数据到服务器》《Android 采用HttpClient提交数据到服务器》介绍了android的两种提交数据到服务器的方法

本文将介绍另外一种基于框架android-async-http的方法来实现

android-async-http是一个强大的网络请求库,这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。android-async-http是一个强大的第三方开源网络请求库

官网源码:https://github.com/loopj/android-async-http

官网教程:http://loopj.com/android-async-http/

新建项目,先到github上:https://github.com/loopj/android-async-http/tree/1.4.0

下载相应的zip文件,解压缩后将src中的com文件夹复制到项目的src目录

下面使用框架android-async-http,代码如下:

package com.wuyudong.asynchttp;

import java.net.URLEncoder;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler; import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View view) {
// 用户名密码提交到服务器
AsyncHttpClient client = new AsyncHttpClient();
String path = "http://169.254.168.71:8080/web/LoginServlet?username="
+ URLEncoder.encode("wuyudong") + "&password="
+ URLEncoder.encode("123"); client.get(path, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String content) {
// TODO Auto-generated method stub
super.onSuccess(content);
Toast.makeText(MainActivity.this, "请求成功!", 0).show();
} @Override
public void onFailure(Throwable error, String content) {
// TODO Auto-generated method stub
super.onFailure(error, content);
Toast.makeText(MainActivity.this, "请求失败!", 0).show();
}
}); } }

可以看到代码量减少了很多


下面来实现一个精简版的异步框架

新建项目

AsyncHttpClient.java

package com.wuyudong.AsyncClient;

import java.io.IOException;
import java.io.InputStream; import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient; import android.os.Message; public class AsyncHttpClient { public void get(final String path, final MyHandler myHandler) { new Thread() {
@Override
public void run() { HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(path); try {
HttpResponse response = client.execute(httpGet);
InputStream is = response.getEntity().getContent();
String content = StreamTools.readInputStream(is); // 执行成功
Message msg = new Message();
msg.what = 0;
msg.obj = "请求成功";
myHandler.sendMessage(msg); } catch (Exception e) {
e.printStackTrace();
// 执行失败
Message msg = new Message();
msg.what = 1;
msg.obj = "请求失败";
myHandler.sendMessage(msg);
} }
}.start(); } }

MainActivity.java

package com.wuyudong.AsyncClient;

import java.net.URLEncoder;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View view) {
// 1、开启子线程 执行一个http请求,在后台执行 在子线程执行 // 2、 子线程执行完毕后通知ui界面 AsyncHttpClient client = new AsyncHttpClient();
String path = "http://169.254.168.71:8080/web/LoginServlet?username="
+ URLEncoder.encode("wuyudong") + "&password="
+ URLEncoder.encode("123");
client.get(path, new MyHandler() {
@Override
public void onFailure(String content) {
Toast.makeText(MainActivity.this, content, 1).show();
super.onFailure(content); } @Override
public void onSuccess(String content) {
Toast.makeText(MainActivity.this, content, 0).show();
super.onSuccess(content); }
}); }
}

MyHandler.java

package com.wuyudong.AsyncClient;

import android.os.Handler;
import android.os.Message; public class MyHandler extends Handler {
public void onFailure(String content) { } public void onSuccess(String content) { } @Override
public void handleMessage(Message msg) {
String content = (String) msg.obj;
switch (msg.what) {
case 0:
onSuccess(content);
break; case 1:
onFailure(content);
break;
default:
break;
}
super.handleMessage(msg);
}
}

StreamTools.java

package com.wuyudong.AsyncClient;

import java.io.ByteArrayOutputStream;
import java.io.InputStream; public class StreamTools {
/**
* 把输入流的内容转化成字符串
*
* @param is
* @return
*/
public static String readInputStream(InputStream is) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
is.close();
baos.close();
byte[] result = baos.toByteArray(); String str = new String(result);
// 试着解析result里面的字符串
if (str.contains("gb2312")) {
return new String(result, "gb2312");
} else if(str.contains("utf-8")){
return str;
} else {
return null;
} //return new String(result, "gb2312");
} catch (Exception e) {
e.printStackTrace();
return null;
} } }

Android 异步Http框架简介和实现原理的更多相关文章

  1. [android] 异步http框架与实现原理

    介绍github上的异步http框架android-async-http loopj开发 获取AsyncHttpClient对象,通过new 调用AsyncHttpClient对象的get(url,r ...

  2. Android 异步查询框架AsyncQueryHandler的使用

    AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...

  3. Android异步任务处理框架AsyncTask源代码分析

    [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...

  4. Android动画学习(一)——Android动画系统框架简介

    2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...

  5. android异步Http框架

    首先在GitHub上下载异步Http框架代码以及相关文档: 将jar包放入lib包中即可: 接下来分别实现get.post.文件上传功能实现: 代码实现如下: AsyncHttpClient clie ...

  6. 异步http框架简介&实现原理

    1 )说明: Android开源代码:www.github.com 模拟一个异步http请求说明

  7. 深入探讨Android异步精髓Handler

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...

  8. 阿里 AndFix 热修复框架简介

    阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexCl ...

  9. android 异步加载框架 原理完全解析

    一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...

随机推荐

  1. Elasticsearch聚合 之 DateRange日期范围聚合

    相比于range聚合,date range就是范围可以由时间来指定. 例如: { "aggs":{ "range":{ "date_range&quo ...

  2. BitCoinJ之Hello World示例程序

    简介 比特币(BitCoin)是一种基于区块链(BlockChain)技术的数字化货币. 本文介绍了使用基于Java语言的BitCoinJ API实现一个简单的收取和支付比特币的示例程序. 开发环境 ...

  3. 3.openstack之mitaka搭建keystone认证服务

    认证服务keystone部署 一:安装和配置服务 1.建库建用户 mysql -u root -p CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON ...

  4. MySql笔记01

    用了两天的时间终于把MySql安装好了,还是很麻烦的,之所以没有选择直接安装,使用的是免安装版本,主要是想了解这个数据库的配置,这样以后就可以更好的了解它了. 登录MySql:mysql –h loc ...

  5. iOS——使用StroryBoard页面跳转及传值

    之前在网上搜iOS的页面跳转大多都是按回以前的那种xib的形式,但鄙人是使用storyboard的.这篇就只介绍利用storyboard进行页面跳转与传值. 新建页面 iOS的程序也是使用了MVC的思 ...

  6. 了解WP的传感器

    之前看到老大的一个QQ签名,说想写一个WP的程序,可是后来,后来就没有后来了.我去年打算学一下WP程序开发的,一年了也无任何进展,我可不想后来,后来就没有后来.于是抽时间来接触一下.虽然都是用CShs ...

  7. 做贴吧系统,偶然发现使用iframe的弊端

    个人拙见 常听人说起现在不建议使用iframe框架,而我却一再使用,也许是能力有限,一直没在意有什么弊端. 我这此使用的事左右iframe框架,并且只在主页中定义了大背景,每个页面并没有分别定义背景, ...

  8. Newtonsoft.Json 用法

    Newtonsoft.Json 是.NET 下开源的json格式序列号和反序列化的类库.官方网站: http://json.codeplex.com/ 使用方法 1.首先下载你需要的版本,然后在应用程 ...

  9. Redis系列二之事务及消息通知

    一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...

  10. HTTP 错误 500.19 - Internal Server Error 错误解决

    今天在测试部署站点是遇到一个问题 HTTP 错误 500.19 - Internal Server Error  如下图,在网上搜了写解决方法,什么设置iis目录浏览,删除web.config中配置, ...