在前几篇文章中《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,代码如下:

  1. package com.wuyudong.asynchttp;
  2.  
  3. import java.net.URLEncoder;
  4.  
  5. import com.loopj.android.http.AsyncHttpClient;
  6. import com.loopj.android.http.AsyncHttpResponseHandler;
  7.  
  8. import android.os.Bundle;
  9. import android.app.Activity;
  10. import android.view.View;
  11. import android.widget.Toast;
  12.  
  13. public class MainActivity extends Activity {
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. }
  20.  
  21. public void click(View view) {
  22. // 用户名密码提交到服务器
  23. AsyncHttpClient client = new AsyncHttpClient();
  24. String path = "http://169.254.168.71:8080/web/LoginServlet?username="
  25. + URLEncoder.encode("wuyudong") + "&password="
  26. + URLEncoder.encode("123");
  27.  
  28. client.get(path, new AsyncHttpResponseHandler() {
  29. @Override
  30. public void onSuccess(String content) {
  31. // TODO Auto-generated method stub
  32. super.onSuccess(content);
  33. Toast.makeText(MainActivity.this, "请求成功!", 0).show();
  34. }
  35.  
  36. @Override
  37. public void onFailure(Throwable error, String content) {
  38. // TODO Auto-generated method stub
  39. super.onFailure(error, content);
  40. Toast.makeText(MainActivity.this, "请求失败!", 0).show();
  41. }
  42. });
  43.  
  44. }
  45.  
  46. }

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


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

新建项目

AsyncHttpClient.java

  1. package com.wuyudong.AsyncClient;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5.  
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.client.ClientProtocolException;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.impl.client.DefaultHttpClient;
  11.  
  12. import android.os.Message;
  13.  
  14. public class AsyncHttpClient {
  15.  
  16. public void get(final String path, final MyHandler myHandler) {
  17.  
  18. new Thread() {
  19. @Override
  20. public void run() {
  21.  
  22. HttpClient client = new DefaultHttpClient();
  23. HttpGet httpGet = new HttpGet(path);
  24.  
  25. try {
  26. HttpResponse response = client.execute(httpGet);
  27. InputStream is = response.getEntity().getContent();
  28. String content = StreamTools.readInputStream(is);
  29.  
  30. // 执行成功
  31. Message msg = new Message();
  32. msg.what = 0;
  33. msg.obj = "请求成功";
  34. myHandler.sendMessage(msg);
  35.  
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. // 执行失败
  39. Message msg = new Message();
  40. msg.what = 1;
  41. msg.obj = "请求失败";
  42. myHandler.sendMessage(msg);
  43. }
  44.  
  45. }
  46. }.start();
  47.  
  48. }
  49.  
  50. }

MainActivity.java

  1. package com.wuyudong.AsyncClient;
  2.  
  3. import java.net.URLEncoder;
  4.  
  5. import android.os.Bundle;
  6. import android.app.Activity;
  7. import android.view.View;
  8. import android.widget.Toast;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. }
  17.  
  18. public void click(View view) {
  19. // 1、开启子线程 执行一个http请求,在后台执行 在子线程执行
  20.  
  21. // 2、 子线程执行完毕后通知ui界面
  22.  
  23. AsyncHttpClient client = new AsyncHttpClient();
  24. String path = "http://169.254.168.71:8080/web/LoginServlet?username="
  25. + URLEncoder.encode("wuyudong") + "&password="
  26. + URLEncoder.encode("123");
  27. client.get(path, new MyHandler() {
  28. @Override
  29. public void onFailure(String content) {
  30. Toast.makeText(MainActivity.this, content, 1).show();
  31. super.onFailure(content);
  32.  
  33. }
  34.  
  35. @Override
  36. public void onSuccess(String content) {
  37. Toast.makeText(MainActivity.this, content, 0).show();
  38. super.onSuccess(content);
  39.  
  40. }
  41. });
  42.  
  43. }
  44. }

MyHandler.java

  1. package com.wuyudong.AsyncClient;
  2.  
  3. import android.os.Handler;
  4. import android.os.Message;
  5.  
  6. public class MyHandler extends Handler {
  7. public void onFailure(String content) {
  8.  
  9. }
  10.  
  11. public void onSuccess(String content) {
  12.  
  13. }
  14.  
  15. @Override
  16. public void handleMessage(Message msg) {
  17. String content = (String) msg.obj;
  18. switch (msg.what) {
  19. case 0:
  20. onSuccess(content);
  21. break;
  22.  
  23. case 1:
  24. onFailure(content);
  25. break;
  26. default:
  27. break;
  28. }
  29. super.handleMessage(msg);
  30. }
  31. }

StreamTools.java

  1. package com.wuyudong.AsyncClient;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.InputStream;
  5.  
  6. public class StreamTools {
  7. /**
  8. * 把输入流的内容转化成字符串
  9. *
  10. * @param is
  11. * @return
  12. */
  13. public static String readInputStream(InputStream is) {
  14. try {
  15. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  16. int len = 0;
  17. byte[] buffer = new byte[1024];
  18. while ((len = is.read(buffer)) != -1) {
  19. baos.write(buffer, 0, len);
  20. }
  21. is.close();
  22. baos.close();
  23. byte[] result = baos.toByteArray();
  24.  
  25. String str = new String(result);
  26. // 试着解析result里面的字符串
  27. if (str.contains("gb2312")) {
  28. return new String(result, "gb2312");
  29. } else if(str.contains("utf-8")){
  30. return str;
  31. } else {
  32. return null;
  33. }
  34.  
  35. //return new String(result, "gb2312");
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. return null;
  39. }
  40.  
  41. }
  42.  
  43. }

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. JS的一些日期操作

    以下语句,作者都亲自整理,并调试过,转载请注明出处 var nowDate = new Date(); nowDate.getYear(); //获取当前年份(2位) nowDate.getFullY ...

  2. JavaScript之旅(DOM)

    JavaScript之旅(DOM) [TOC] 一.认识DOM 什么是 DOM? DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准 ...

  3. ASP.NET MVC WEB API必知必会知识点总结

    一.理解WEB API:提供基于RESTful架构的WEB服务,通过HTTP请求方法(GET, PUT, POST, DELETE)映射到服务器端相应的ACTION方法(CRUD). RESTful架 ...

  4. SignalR入门之基本介绍

    SignalR是微软对web开发技术的扩充,它是一种框架,方便用来创建实时应用程序. 有一些即时消息系统,实时协作工作集,多人在线游戏,信息广播服务等其他需要在信息产生时就能进行发送的任务系统. 对于 ...

  5. CSRF 攻击介绍

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

  6. 第二讲:WCF介绍(2)

    代码 https://yunpan.cn/cPns5DkGnRGNs   密码:3913   在上一讲中我们说到 在代码 当中  完成了 服务的寄宿. 这里我们说下 在实际的开发 当中 我们一般不会去 ...

  7. PHP的PSR系列规范都有啥内容

    PSR 是PHP Standard Recommendation的简写,它其实应该叫PSRs,即系列推荐标准:目前通过的规范有PSR-0(Autoloading Standard).PSR-1(Bas ...

  8. 容器--EnumMap

    一.概述 EnumMap是一类特殊的Map, 其特殊之处在于KEY需要是枚举类型,由于枚举类型的特点是值的个数是固定的,所以,对于EnumMap来说,其所能存储的个数也就是固定的了.这种类型的Map相 ...

  9. No suitable driver found for jdbc:mysql://localhost:3306/dmc

    1. 使用java jdbc直接连接数据库操作, 出现题中错误, 参考网上说法, 将mysql连接jar放入jre拓展底下 不再报错

  10. Linux下如何查看哪个进程占用内存多?

    1.top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者 ...