Android 异步Http框架简介和实现原理
在前几篇文章中《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框架简介和实现原理的更多相关文章
- [android] 异步http框架与实现原理
介绍github上的异步http框架android-async-http loopj开发 获取AsyncHttpClient对象,通过new 调用AsyncHttpClient对象的get(url,r ...
- Android 异步查询框架AsyncQueryHandler的使用
AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...
- Android异步任务处理框架AsyncTask源代码分析
[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...
- Android动画学习(一)——Android动画系统框架简介
2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...
- android异步Http框架
首先在GitHub上下载异步Http框架代码以及相关文档: 将jar包放入lib包中即可: 接下来分别实现get.post.文件上传功能实现: 代码实现如下: AsyncHttpClient clie ...
- 异步http框架简介&实现原理
1 )说明: Android开源代码:www.github.com 模拟一个异步http请求说明
- 深入探讨Android异步精髓Handler
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...
- 阿里 AndFix 热修复框架简介
阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexCl ...
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
随机推荐
- JS的一些日期操作
以下语句,作者都亲自整理,并调试过,转载请注明出处 var nowDate = new Date(); nowDate.getYear(); //获取当前年份(2位) nowDate.getFullY ...
- JavaScript之旅(DOM)
JavaScript之旅(DOM) [TOC] 一.认识DOM 什么是 DOM? DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准 ...
- ASP.NET MVC WEB API必知必会知识点总结
一.理解WEB API:提供基于RESTful架构的WEB服务,通过HTTP请求方法(GET, PUT, POST, DELETE)映射到服务器端相应的ACTION方法(CRUD). RESTful架 ...
- SignalR入门之基本介绍
SignalR是微软对web开发技术的扩充,它是一种框架,方便用来创建实时应用程序. 有一些即时消息系统,实时协作工作集,多人在线游戏,信息广播服务等其他需要在信息产生时就能进行发送的任务系统. 对于 ...
- CSRF 攻击介绍
CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...
- 第二讲:WCF介绍(2)
代码 https://yunpan.cn/cPns5DkGnRGNs 密码:3913 在上一讲中我们说到 在代码 当中 完成了 服务的寄宿. 这里我们说下 在实际的开发 当中 我们一般不会去 ...
- PHP的PSR系列规范都有啥内容
PSR 是PHP Standard Recommendation的简写,它其实应该叫PSRs,即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard).PSR-1(Bas ...
- 容器--EnumMap
一.概述 EnumMap是一类特殊的Map, 其特殊之处在于KEY需要是枚举类型,由于枚举类型的特点是值的个数是固定的,所以,对于EnumMap来说,其所能存储的个数也就是固定的了.这种类型的Map相 ...
- No suitable driver found for jdbc:mysql://localhost:3306/dmc
1. 使用java jdbc直接连接数据库操作, 出现题中错误, 参考网上说法, 将mysql连接jar放入jre拓展底下 不再报错
- Linux下如何查看哪个进程占用内存多?
1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者 ...