zoukankan      html  css  js  c++  java
  • Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    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就行了...

    public void get(final String url,final AbRequestParams params,final AbHttpResponseListener responseListener) {
            
            responseListener.setHandler(new ResponderHandler(responseListener));
            executorService.submit(new Runnable() { 
                public void run() {
                    try {
                        doGet(url,params,responseListener);
                    } catch (Exception e) { 
                        e.printStackTrace();
                    }
                }                 
            });                
        }

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

    private void doGet(String url,AbRequestParams params,AbHttpResponseListener responseListener){
              try {
                  
                  responseListener.sendStartMessage();
                  
                  if(!debug && !AbAppUtil.isNetworkAvailable(mContext)){
                        responseListener.sendFailureMessage(AbConstant.CONNECT_FAILURE_CODE,AbConstant.CONNECTEXCEPTION, new AbAppException(AbConstant.CONNECTEXCEPTION));
                        return;
                  }
                  
                  //HttpGet连接对象  
                  if(params!=null){
                      url += params.getParamString(); //如果有参,那么获取相关参数...
                  }
                  HttpGet httpRequest = new HttpGet(url); //定义连接对象..
                  
                  BasicHttpParams httpParams = new BasicHttpParams();
                  
                  // 从连接池中取连接的超时时间,设置为1秒
                  ConnManagerParams.setTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
                  ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_MAX_CONNECTIONS));
                  ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);
                  // 读响应数据的超时时间
                  HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
                  HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
                  HttpConnectionParams.setTcpNoDelay(httpParams, true);
                  HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);
                  //设置协议版本...
                  HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
                  HttpProtocolParams.setUserAgent(httpParams, String.format("andbase-http/%s (http://www.418log.org/)", 1.0));
                  // 设置请求参数
                  httpRequest.setParams(httpParams);
                  
                  //取得HttpClient对象  
                  HttpClient httpClient = new DefaultHttpClient();  
                  //请求HttpClient,取得HttpResponse  
                  HttpResponse httpResponse = httpClient.execute(httpRequest);  
                  //请求成功  
                  int statusCode = httpResponse.getStatusLine().getStatusCode();
                  
                  //取得返回的字符串  
                  HttpEntity  mHttpEntity = httpResponse.getEntity();
                  if (statusCode == HttpStatus.SC_OK){  
                      if(responseListener instanceof AbStringHttpResponseListener){
                          String content = EntityUtils.toString(mHttpEntity);
                          ((AbStringHttpResponseListener)responseListener).sendSuccessMessage(statusCode, content);
                      }else if(responseListener instanceof AbBinaryHttpResponseListener){
                          readResponseData(mHttpEntity,((AbBinaryHttpResponseListener)responseListener));
                      }else if(responseListener instanceof AbFileHttpResponseListener){
                          //获取文件名
                          String fileName = AbFileUtil.getFileNameFromUrl(url, httpResponse);
                          writeResponseData(mHttpEntity,fileName,((AbFileHttpResponseListener)responseListener));
                      }
                  }else{
                      String content = EntityUtils.toString(mHttpEntity);
                      responseListener.sendFailureMessage(statusCode, content, new AbAppException(AbConstant.UNKNOWNHOSTEXCEPTION));
                  }
            } catch (Exception e) {
                e.printStackTrace();
                //发送失败消息
                responseListener.sendFailureMessage(AbConstant.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
            }finally{
                responseListener.sendFinishMessage();
            }
        }
        

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

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

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

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

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

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

      GetResponseListener.java

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

    package com.example.andbasehttp;
    
    import java.io.File;
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.graphics.Bitmap;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    import com.ab.activity.AbActivity;
    import com.ab.http.AbFileHttpResponseListener;
    import com.ab.util.AbFileUtil;
    import com.ab.view.progress.AbHorizontalProgressBar;
    
    public class FileResponseListener extends AbFileHttpResponseListener{
    
        
        private int max=100;
        private int progress=0;
        private AbActivity activity;
        private Context context;
        private AlertDialog dialog;
        private View view;
        private TextView max_tv,num_tv;
        private AbHorizontalProgressBar progressBar;
        
        public FileResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){
            this.activity=activity;
            this.context=context;
            this.view=v;
            this.max_tv=v1;
            this.num_tv=v2;
            this.progressBar=progressBar;
        }
        
        @Override
        public void onSuccess(int statusCode, File file){
            Bitmap bitmap=AbFileUtil.getBitmapFromSD(file);
            ImageView view=new ImageView(context);
            view.setImageBitmap(bitmap);
            activity.showDialog("返回结果", view, new OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    
                }
            });
        }
        
        @Override
        public void onFailure(int statusCode, String content,Throwable error){
            activity.showToast(error.toString());
        }
        
        @Override
        public void onStart(){
            max_tv.setText(progress+"/"+String.valueOf(max));
            progressBar.setMax(max);
            progressBar.setProgress(progress);
            dialog=activity.showDialog("正在下载", view);
        }
        
        @Override
        public void onProgress(int bytesWritten, int totalSize){
            max_tv.setText(bytesWritten/(totalSize/max)+"/"+max);
            progressBar.setProgress(bytesWritten/(totalSize/max));
        }
        
        @Override
        public void onFinish(){
            dialog.cancel();
            dialog=null;
        }
    }

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

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

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

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

    <%
      String name=request.getParameter("name");
      String password=request.getParameter("password");
      if("darker".equals(name)&& "49681888".equals(password)){
          out.println("Receive name is:"+name);
        out.println("Receive password is:"+password);%>
        Your Message are right!
      <%}else{
          out.println("Receive name is:"+name);
        out.println("Receive password is:"+password);%>
        Your Message are wrong!
      <%}%>  

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

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

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

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

    package com.example.andbasehttp;
    
    
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.view.View;
    import android.widget.TextView;
    import com.ab.activity.AbActivity;
    import com.ab.http.AbStringHttpResponseListener;
    import com.ab.view.progress.AbHorizontalProgressBar;
    
    public class FileSendResponseListener extends AbStringHttpResponseListener{
    
        private int max=100;
        private int progress=0;
        private AbActivity activity;
        private Context context;
        private AlertDialog dialog;
        private View view;
        private TextView max_tv,num_tv;
        private AbHorizontalProgressBar progressBar;
        
        public FileSendResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){
            this.activity=activity;
            this.context=context;
            this.view=v;
            this.max_tv=v1;
            this.num_tv=v2;
            this.progressBar=progressBar;
        }
        
        @Override
        public void onSuccess(int statusCode, String content){
            activity.showToast("OnSuccess");
            System.out.println(content);
        }
        
        @Override
        public void onFailure(int statusCode, String content,Throwable error){
            activity.showToast(error.toString());
        }
        
        @Override
        public void onStart(){
            max_tv.setText(progress+"/"+String.valueOf(max));
            progressBar.setMax(max);
            progressBar.setProgress(progress);
            activity.showToast("正在下载");
            dialog=activity.showDialog("正在下载", view);
        }
        
        @Override
        public void onProgress(int bytesWritten, int totalSize){
            max_tv.setText(bytesWritten/(totalSize/max)+"/"+max);
            progressBar.setProgress(bytesWritten/(totalSize/max));
        }
        
        @Override
        public void onFinish(){
            dialog.cancel();
            dialog=null;
        }
    }

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

      2.AbBinaryHttpResponseListener.java

      3.AbFileHttpResponseListener.java

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

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

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

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

     

     

     

  • 相关阅读:
    163邮箱手机版怎么登录?原来邮箱无需账号就能登陆也有技巧!
    Failed to register dubbo://192.168.137.1:20880/com.youfan.service.SayHelloService?anyhost=true&appli
    Linux下安装zookeeper
    ZooKeeper 启动报错ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/
    Github的工作流程
    Git+Github 的工作流程
    如何通过github pages自定义CSDN、简书、博客园等平台域名
    remote: Repository not found. fatal: repository 'https://github.com/AlbertYang666/AlbertYang666.gith
    在maven项目中配置数据库连接池Druid
    在Spring+maven项目中配置数据库连接池Druid
  • 原文地址:https://www.cnblogs.com/RGogoing/p/4929714.html
Copyright © 2011-2022 走看看