PS:踏踏实实走好每一步...

学习内容:

1.使用AndBase框架实现无参Http Get请求...

2.使用AndBase框架实现有参Http Post请求...

3.使用AndBase框架实现有参Http Get请求...

  AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼主对比了两个框架中的源码...Volley更多的地方是使用抽象方法封装在接口内,然后对外暴露接口,其他类在实现接口的同时需要实现内部的抽象方法...而AndBase则是使用继承的方式..继承父类..实现类通过重写的方式对封装的方法重写从而进行下一步的操作...

  相比二者网络请求的源码,Volley源码的书写还是更胜一筹...Volley是Google推出的,针对的也仅仅是网络请求这一模块...同样AndBase也是非常优秀的,是国内牛人写的一款重量级框架,涉及的模块非常的广泛,还是非常好用的...

1.使用AndBase框架实现无参Http Get请求...

  一般普通的网络请求如果不涉及到数据信息的变化,也就是不涉及一些安全性问题,都可以使用Get方式来完成网络请求...Get请求也是分为有参和无参的,给我的感觉有参一般可以用于向服务器上传资源数据...先介绍一下无参的Get请求...还是先从源码的地方来看看...

  源码的调用方式是先使用AbHttpUtils.get()函数调用...不过这无关紧要...通过这个方法走向AbHttpClient类内部...执行下面这段源码...无论是有参还是无参..都会调用这个方法..无参的时候第二个参数传递null就行了...

  1. public void get(final String url,final AbRequestParams params,final AbHttpResponseListener responseListener) {
  2.  
  3. responseListener.setHandler(new ResponderHandler(responseListener));
  4. executorService.submit(new Runnable() {
  5. public void run() {
  6. try {
  7. doGet(url,params,responseListener);
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. });
  13. }

  我们可以看到,这段函数首先通过Handler发送Message...同时开启一个线程池,来提交当前的请求...最后将执行doGet()方法...同时Handler一直对responseListener的消息进行处理..doGet()方法的源码过程如下...

  1. private void doGet(String url,AbRequestParams params,AbHttpResponseListener responseListener){
  2. try {
  3.  
  4. responseListener.sendStartMessage();
  5.  
  6. if(!debug && !AbAppUtil.isNetworkAvailable(mContext)){
  7. responseListener.sendFailureMessage(AbConstant.CONNECT_FAILURE_CODE,AbConstant.CONNECTEXCEPTION, new AbAppException(AbConstant.CONNECTEXCEPTION));
  8. return;
  9. }
  10.  
  11. //HttpGet连接对象
  12. if(params!=null){
  13. url += params.getParamString(); //如果有参,那么获取相关参数...
  14. }
  15. HttpGet httpRequest = new HttpGet(url); //定义连接对象..
  16.  
  17. BasicHttpParams httpParams = new BasicHttpParams();
  18.  
  19. // 从连接池中取连接的超时时间,设置为1秒
  20. ConnManagerParams.setTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
  21. ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_MAX_CONNECTIONS));
  22. ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);
  23. // 读响应数据的超时时间
  24. HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
  25. HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
  26. HttpConnectionParams.setTcpNoDelay(httpParams, true);
  27. HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);
  28. //设置协议版本...
  29. HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
  30. HttpProtocolParams.setUserAgent(httpParams, String.format("andbase-http/%s (http://www.418log.org/)", 1.0));
  31. // 设置请求参数
  32. httpRequest.setParams(httpParams);
  33.  
  34. //取得HttpClient对象
  35. HttpClient httpClient = new DefaultHttpClient();
  36. //请求HttpClient,取得HttpResponse
  37. HttpResponse httpResponse = httpClient.execute(httpRequest);
  38. //请求成功
  39. int statusCode = httpResponse.getStatusLine().getStatusCode();
  40.  
  41. //取得返回的字符串
  42. HttpEntity mHttpEntity = httpResponse.getEntity();
  43. if (statusCode == HttpStatus.SC_OK){
  44. if(responseListener instanceof AbStringHttpResponseListener){
  45. String content = EntityUtils.toString(mHttpEntity);
  46. ((AbStringHttpResponseListener)responseListener).sendSuccessMessage(statusCode, content);
  47. }else if(responseListener instanceof AbBinaryHttpResponseListener){
  48. readResponseData(mHttpEntity,((AbBinaryHttpResponseListener)responseListener));
  49. }else if(responseListener instanceof AbFileHttpResponseListener){
  50. //获取文件名
  51. String fileName = AbFileUtil.getFileNameFromUrl(url, httpResponse);
  52. writeResponseData(mHttpEntity,fileName,((AbFileHttpResponseListener)responseListener));
  53. }
  54. }else{
  55. String content = EntityUtils.toString(mHttpEntity);
  56. responseListener.sendFailureMessage(statusCode, content, new AbAppException(AbConstant.UNKNOWNHOSTEXCEPTION));
  57. }
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. //发送失败消息
  61. responseListener.sendFailureMessage(AbConstant.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
  62. }finally{
  63. responseListener.sendFinishMessage();
  64. }
  65. }

  有了上面的源码调用过程其实就非常的清晰了..

  无论是doGet()方法还是doPost()方法模式基本是相同的,都是需要先建立一个连接对象,HttpGet或HttpPost..不同之处在于有参的Get请求直接将params加入到url后面即可,而Post请求需要获取实体数据..在实体数据中加入我们传递的params..设置连接过程和读取数据过程中的相关参数,比如说超时的时间,使用的Http版本,设置UserAgent等等...设置完之后执行请求获取响应了...

  中间涉及到了一个判断的过程..判断返回的响应数据到底属于什么类型的数据,是基本的String类型,还是与图片或者视频相关的Byte类型,还是与文件相关的File类型...通过对相关类型的判断,执行不同的方法,虽然方法不相同,但是最后的目的是一样的,都是把实体数据进行封装...封装完毕后调用sendSuccessMessage然后Handler自动回去处理Message...最后调用OnSuccess方法..将数据返回给客户端..

  还是看一下实际的调用过程...

  无参的Get请求调度...这里需要设置相应监听...

  1. public void FileClick(View v){
  2. url="http://192.168.199.172:8080/JSP/imageview.jpg";
  3. getView();
  4. httpUtil.get(url, new FileResponseListener(this, this, v,max_tv,num_tv,progressBar));
  5. }

  GetResponseListener.java

  对响应的监听的一个重写过程...通过为请求设置上url+相关监听就能够完成网络请求,并对请求数据进行相关处理了...这里完成了一个图片数据的下载,然后通过对数据进行封装,就成了一个Bitmap..这样就能够在控件上进行显示了..

  1. package com.example.andbasehttp;
  2.  
  3. import java.io.File;
  4.  
  5. import android.app.AlertDialog;
  6. import android.content.Context;
  7. import android.content.DialogInterface;
  8. import android.content.DialogInterface.OnClickListener;
  9. import android.graphics.Bitmap;
  10. import android.view.View;
  11. import android.widget.ImageView;
  12. import android.widget.TextView;
  13. import com.ab.activity.AbActivity;
  14. import com.ab.http.AbFileHttpResponseListener;
  15. import com.ab.util.AbFileUtil;
  16. import com.ab.view.progress.AbHorizontalProgressBar;
  17.  
  18. public class FileResponseListener extends AbFileHttpResponseListener{
  19.  
  20. private int max=100;
  21. private int progress=0;
  22. private AbActivity activity;
  23. private Context context;
  24. private AlertDialog dialog;
  25. private View view;
  26. private TextView max_tv,num_tv;
  27. private AbHorizontalProgressBar progressBar;
  28.  
  29. public FileResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){
  30. this.activity=activity;
  31. this.context=context;
  32. this.view=v;
  33. this.max_tv=v1;
  34. this.num_tv=v2;
  35. this.progressBar=progressBar;
  36. }
  37.  
  38. @Override
  39. public void onSuccess(int statusCode, File file){
  40. Bitmap bitmap=AbFileUtil.getBitmapFromSD(file);
  41. ImageView view=new ImageView(context);
  42. view.setImageBitmap(bitmap);
  43. activity.showDialog("返回结果", view, new OnClickListener() {
  44.  
  45. @Override
  46. public void onClick(DialogInterface dialog, int which) {
  47. // TODO Auto-generated method stub
  48.  
  49. }
  50. });
  51. }
  52.  
  53. @Override
  54. public void onFailure(int statusCode, String content,Throwable error){
  55. activity.showToast(error.toString());
  56. }
  57.  
  58. @Override
  59. public void onStart(){
  60. max_tv.setText(progress+"/"+String.valueOf(max));
  61. progressBar.setMax(max);
  62. progressBar.setProgress(progress);
  63. dialog=activity.showDialog("正在下载", view);
  64. }
  65.  
  66. @Override
  67. public void onProgress(int bytesWritten, int totalSize){
  68. max_tv.setText(bytesWritten/(totalSize/max)+"/"+max);
  69. progressBar.setProgress(bytesWritten/(totalSize/max));
  70. }
  71.  
  72. @Override
  73. public void onFinish(){
  74. dialog.cancel();
  75. dialog=null;
  76. }
  77. }

2.使用AndBase框架实现有参Http Post请求...

  其实调用的方式都是相同的,,只不过Post请求需要传递相关的参数...使用有参的Post请求...这里是向一个JSP传递相关参数来完成数据信息的验证...

  1. public void PostClick(View v){
  2. url="http://192.168.199.172:8080/JSP/post.jsp";
  3. params=new AbRequestParams();
  4. params.put("name", "darker");
  5. params.put("password", "49681888");
  6. httpUtil.post(url, params, new PostResponseListener(this));
  7. }

  这里我就不粘贴PostResponseListener的代码了...贴一下JSP页面的代码..相关的JSP代码如下...这里的JSP代码非常的简单..并且前面在使用Volley的时候也使用过..JSP页面我们完全可以自己书写的更加复杂一些,那么就能够实现更多的功能...

  1. <%
  2. String name=request.getParameter("name");
  3. String password=request.getParameter("password");
  4. if("darker".equals(name)&& "49681888".equals(password)){
  5. out.println("Receive name is:"+name);
  6. out.println("Receive password is:"+password);%>
  7. Your Message are right!
  8. <%}else{
  9. out.println("Receive name is:"+name);
  10. out.println("Receive password is:"+password);%>
  11. Your Message are wrong!
  12. <%}%>

3.使用AndBase框架实现有参Http Get请求...

  有参的Get请求一般用于文件,数据资源的上传...将上传的资源以及名称作为参数传递给服务器..这里不涉及安全上的问题..因此可以使用带有参数的Get请求...这里向服务器上传文件..需要添加相关参数...

  1. public void FileLoadClick(View v){
  2. url="http://192.168.199.172:8080";
  3. AbRequestParams params = new AbRequestParams();
  4. File pathRoot = Environment.getExternalStorageDirectory();
  5. String path = pathRoot.getAbsolutePath();
  6. File file1 = new File(path+"/download/cache_files/aa.txt");
  7. params.put(file1.getName(),file1);
  8.  
  9. getView();
  10. httpUtil.get(url, params, new FileSendResponseListener(this, this, v, max_tv, num_tv, progressBar));
  11. }

  这里的监听事件简单的粘贴一下...监听事件之所以传递控件..是为了更好的向用户进行展示...这里设置了一个进度条的方式,来贯穿整个请求——响应的过程...如果下载或者是上传的文件和资源过多...我们是必须通知用户相关进度的..总不能一直卡死在界面上..这样用户也无法知道到底是否完成了数据的上传或者是下载...

  1. package com.example.andbasehttp;
  2.  
  3. import android.app.AlertDialog;
  4. import android.content.Context;
  5. import android.view.View;
  6. import android.widget.TextView;
  7. import com.ab.activity.AbActivity;
  8. import com.ab.http.AbStringHttpResponseListener;
  9. import com.ab.view.progress.AbHorizontalProgressBar;
  10.  
  11. public class FileSendResponseListener extends AbStringHttpResponseListener{
  12.  
  13. private int max=100;
  14. private int progress=0;
  15. private AbActivity activity;
  16. private Context context;
  17. private AlertDialog dialog;
  18. private View view;
  19. private TextView max_tv,num_tv;
  20. private AbHorizontalProgressBar progressBar;
  21.  
  22. public FileSendResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){
  23. this.activity=activity;
  24. this.context=context;
  25. this.view=v;
  26. this.max_tv=v1;
  27. this.num_tv=v2;
  28. this.progressBar=progressBar;
  29. }
  30.  
  31. @Override
  32. public void onSuccess(int statusCode, String content){
  33. activity.showToast("OnSuccess");
  34. System.out.println(content);
  35. }
  36.  
  37. @Override
  38. public void onFailure(int statusCode, String content,Throwable error){
  39. activity.showToast(error.toString());
  40. }
  41.  
  42. @Override
  43. public void onStart(){
  44. max_tv.setText(progress+"/"+String.valueOf(max));
  45. progressBar.setMax(max);
  46. progressBar.setProgress(progress);
  47. activity.showToast("正在下载");
  48. dialog=activity.showDialog("正在下载", view);
  49. }
  50.  
  51. @Override
  52. public void onProgress(int bytesWritten, int totalSize){
  53. max_tv.setText(bytesWritten/(totalSize/max)+"/"+max);
  54. progressBar.setProgress(bytesWritten/(totalSize/max));
  55. }
  56.  
  57. @Override
  58. public void onFinish(){
  59. dialog.cancel();
  60. dialog=null;
  61. }
  62. }

涉及到的类为com.ab.http保内的所有类...
  1.AbStringHttpResponseListener.java

  2.AbBinaryHttpResponseListener.java

  3.AbFileHttpResponseListener.java

这三个类是对AbHttpResponseListener.java的一个继承...继承了其内部的一些相关方法..包括请求开始,结束,失败等等函数...

  AbHttpClient.java就是用来完成请求——连接过程的实现...其中还包含数据的封装..

  AbHttpUtils.java则是对post,get等方法调用的一个中间层...

  AbRequestParams.java 则是对请求参数处理的一个类...不仅包含对请求参数的处理,还包含对实体的创建..为实体添加相关参数等方法的实现过程...

 

 

 

Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..的更多相关文章

  1. Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

    PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...

  2. Android 学习笔记之AndBase框架学习(六) PullToRefrech 下拉刷新的实现

    PS:Struggle for a better future 学习内容: 1.PullToRefrech下拉刷新的实现...   不得不说AndBase这个开源框架确实是非常的强大..把大部分的东西 ...

  3. Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  4. Android 学习笔记之AndBase框架学习(一) 实现多功能标题栏

    PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBas ...

  5. Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

    PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Gith ...

  6. Android 学习笔记之AndBase框架学习(四) 使用封装好的函数实现单,多线程任务

    PS:Force Is Meaningless Without Skill 学习内容: 1.使用AndBase实现单线程任务... 2.使用AndBase实现多线程任务...   AndBase内部封 ...

  7. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  8. Java基础学习笔记十七 集合框架(三)之Map

    Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存 ...

  9. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是 ...

随机推荐

  1. android studio 乱码

    1. 设置 file- setting -file encodeing- 设置utf-8 2 .  build.gradle 添加 tasks.withType(JavaCompile) { opti ...

  2. c# 字体安装

    [DllImport("kernel32.dll", SetLastError = true)] static extern int WriteProfileString(stri ...

  3. 解决方案: scp/ssh 的登陆提示很慢 (Linux)

    看着用 windows 的 scp 命令很快很是羡慕. 这个问题让我实实郁闷了好几天. 在 Linux 下不管是用 ssh 还是用 scp, 连接速度都很慢 (登陆提示框的弹出时间). 确切地讲, 每 ...

  4. GridView第一个Item中的CheckBox不工作

    问题:如题 解决办法: 修改后: ViewGroup.LayoutParams params =helper.getConvertView().getLayoutParams(); params.wi ...

  5. 小兔的棋盘(hdu2067)

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. 【转】重新封装FetchUrl函数一枚,支持COOKIES,喜欢领走~!

    mjj520 发表于 2012-6-2 09:14 唉 cpu超级耗芸豆的 查了下开发文档,fetchurl原来是不算CPU的,是我误导了大家.  发表于 2012-6-1 17:30:17 |只看该 ...

  7. ECSHOP会员登录后直接进用户中心

    ECSHOP系统在会员登录成功后,不是直接进入用户中心,而是跳转回了上一个页面或者是跳转到了首页. 注意:这里说的是,用户没有主动点击前往哪个页面,让系统自动跳转. 那如何让会员登录成功后自动进入“用 ...

  8. [GraphQL] Serve a GraphQL Schema as Middleware in Express

    If we have a GraphQL Schema expressed in terms of JavaScript, then we have a convenient package avai ...

  9. SQL Server Profiler:使用方法和指标说明

    SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...

  10. SQL Server 连接问题圣经-命名管道

    SQL Server 连接问题圣经-命名管道 (1) APGC DSD Team 12 Jan 2011 1:24 AM 3 一.前言 在使用SQL Server 的过程中,用户遇到的最多的莫过于连接 ...