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 則是對請求參數處理的一個類...不僅包含對請求參數的處理,還包含對實體的創建..為實體添加相關參數等方法的實現過程...

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM