亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android AndBase框架使用封裝好的函數(shù)完成Http請求(三)

 更新時間:2016年03月30日 16:34:51   作者:Darker  
這篇文章主要介紹了Android AndBase框架使用封裝好的函數(shù)完成Http請求的相關(guān)資料,感興趣的小伙伴們可以參考一下

本文是針對AndBase框架學(xué)習(xí)整理的第三篇筆記,想要了解AndBase框架的朋友可以閱讀本文,大家共同學(xué)習(xí)。

學(xué)習(xí)內(nèi)容:

1.使用AndBase框架實(shí)現(xiàn)無參Http Get請求...

2.使用AndBase框架實(shí)現(xiàn)有參Http Post請求...

3.使用AndBase框架實(shí)現(xiàn)有參Http Get請求... 

  AndBase框架為我們提供了一些相關(guān)的方法提供給我們使用,用來完成Http網(wǎng)絡(luò)請求...總體就是對Http請求的一個封裝,不過個人認(rèn)為,網(wǎng)絡(luò)請求這一模塊更加推薦使用Volley框架..樓主對比了兩個框架中的源碼...Volley更多的地方是使用抽象方法封裝在接口內(nèi),然后對外暴露接口,其他類在實(shí)現(xiàn)接口的同時需要實(shí)現(xiàn)內(nèi)部的抽象方法...而AndBase則是使用繼承的方式..繼承父類..實(shí)現(xiàn)類通過重寫的方式對封裝的方法重寫從而進(jìn)行下一步的操作...

  相比二者網(wǎng)絡(luò)請求的源碼,Volley源碼的書寫還是更勝一籌...Volley是Google推出的,針對的也僅僅是網(wǎng)絡(luò)請求這一模塊...同樣AndBase也是非常優(yōu)秀的,是國內(nèi)牛人寫的一款重量級框架,涉及的模塊非常的廣泛,還是非常好用的...

1.使用AndBase框架實(shí)現(xiàn)無參Http Get請求

  一般普通的網(wǎng)絡(luò)請求如果不涉及到數(shù)據(jù)信息的變化,也就是不涉及一些安全性問題,都可以使用Get方式來完成網(wǎng)絡(luò)請求...Get請求也是分為有參和無參的,給我的感覺有參一般可以用于向服務(wù)器上傳資源數(shù)據(jù)...先介紹一下無參的Get請求...還是先從源碼的地方來看看...

  源碼的調(diào)用方式是先使用AbHttpUtils.get()函數(shù)調(diào)用...不過這無關(guān)緊要...通過這個方法走向AbHttpClient類內(nèi)部...執(zhí)行下面這段源碼...無論是有參還是無參..都會調(diào)用這個方法..無參的時候第二個參數(shù)傳遞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();
    }
   }     
  });    
 }

  我們可以看到,這段函數(shù)首先通過Handler發(fā)送Message...同時開啟一個線程池,來提交當(dāng)前的請求,最后將執(zhí)行doGet()方法,同時Handler一直對responseListener的消息進(jìn)行處理..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(); //如果有參,那么獲取相關(guān)參數(shù)...
    }
    HttpGet httpRequest = new HttpGet(url); //定義連接對象..
    
    BasicHttpParams httpParams = new BasicHttpParams();
    
    // 從連接池中取連接的超時時間,設(shè)置為1秒
    ConnManagerParams.setTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_MAX_CONNECTIONS));
    ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);
    // 讀響應(yīng)數(shù)據(jù)的超時時間
    HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
    HttpConnectionParams.setTcpNoDelay(httpParams, true);
    HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);
    //設(shè)置協(xié)議版本...
    HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUserAgent(httpParams, String.format("andbase-http/%s (http://www.418log.org/)", 1.0));
    // 設(shè)置請求參數(shù)
    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();
   //發(fā)送失敗消息
   responseListener.sendFailureMessage(AbConstant.UNTREATED_CODE,e.getMessage(),new AbAppException(e));
  }finally{
   responseListener.sendFinishMessage();
  }
 }

 有了上面的源碼調(diào)用過程其實(shí)就非常的清晰了..

  無論是doGet()方法還是doPost()方法模式基本是相同的,都是需要先建立一個連接對象,HttpGet或HttpPost..不同之處在于有參的Get請求直接將params加入到url后面即可,而Post請求需要獲取實(shí)體數(shù)據(jù)..在實(shí)體數(shù)據(jù)中加入我們傳遞的params..設(shè)置連接過程和讀取數(shù)據(jù)過程中的相關(guān)參數(shù),比如說超時的時間,使用的Http版本,設(shè)置UserAgent等等...設(shè)置完之后執(zhí)行請求獲取響應(yīng)了...

  中間涉及到了一個判斷的過程..判斷返回的響應(yīng)數(shù)據(jù)到底屬于什么類型的數(shù)據(jù),是基本的String類型,還是與圖片或者視頻相關(guān)的Byte類型,還是與文件相關(guān)的File類型...通過對相關(guān)類型的判斷,執(zhí)行不同的方法,雖然方法不相同,但是最后的目的是一樣的,都是把實(shí)體數(shù)據(jù)進(jìn)行封裝...封裝完畢后調(diào)用sendSuccessMessage然后Handler自動回去處理Message...最后調(diào)用OnSuccess方法..將數(shù)據(jù)返回給客戶端..

  還是看一下實(shí)際的調(diào)用過程:

  無參的Get請求調(diào)度,這里需要設(shè)置相應(yīng)監(jiān)聽:

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

  對響應(yīng)的監(jiān)聽的一個重寫過程...通過為請求設(shè)置上url+相關(guān)監(jiān)聽就能夠完成網(wǎng)絡(luò)請求,并對請求數(shù)據(jù)進(jìn)行相關(guān)處理了...這里完成了一個圖片數(shù)據(jù)的下載,然后通過對數(shù)據(jù)進(jìn)行封裝,就成了一個Bitmap..這樣就能夠在控件上進(jìn)行顯示了..

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("返回結(jié)果", 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框架實(shí)現(xiàn)有參Http Post請求 

其實(shí)調(diào)用的方式都是相同的,,只不過Post請求需要傳遞相關(guān)的參數(shù)...使用有參的Post請求...這里是向一個JSP傳遞相關(guān)參數(shù)來完成數(shù)據(jù)信息的驗(yàn)證...

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頁面的代碼..相關(guān)的JSP代碼如下...這里的JSP代碼非常的簡單..并且前面在使用Volley的時候也使用過..JSP頁面我們完全可以自己書寫的更加復(fù)雜一些,那么就能夠?qū)崿F(xiàn)更多的功能...

<%
 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框架實(shí)現(xiàn)有參Http Get請求

  有參的Get請求一般用于文件,數(shù)據(jù)資源的上傳...將上傳的資源以及名稱作為參數(shù)傳遞給服務(wù)器..這里不涉及安全上的問題..因此可以使用帶有參數(shù)的Get請求...這里向服務(wù)器上傳文件..需要添加相關(guān)參數(shù)...

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));
 }

這里的監(jiān)聽事件簡單的粘貼一下...監(jiān)聽事件之所以傳遞控件..是為了更好的向用戶進(jìn)行展示...這里設(shè)置了一個進(jìn)度條的方式,來貫穿整個請求——響應(yīng)的過程...如果下載或者是上傳的文件和資源過多...我們是必須通知用戶相關(guān)進(jìn)度的..總不能一直卡死在界面上..這樣用戶也無法知道到底是否完成了數(shù)據(jù)的上傳或者是下載...

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保內(nèi)的所有類...
  1.AbStringHttpResponseListener.java

  2.AbBinaryHttpResponseListener.java

  3.AbFileHttpResponseListener.java

這三個類是對AbHttpResponseListener.java的一個繼承...繼承了其內(nèi)部的一些相關(guān)方法..包括請求開始,結(jié)束,失敗等等函數(shù)...

  AbHttpClient.java就是用來完成請求——連接過程的實(shí)現(xiàn)...其中還包含數(shù)據(jù)的封裝;

  AbHttpUtils.java則是對post,get等方法調(diào)用的一個中間層;

  AbRequestParams.java 則是對請求參數(shù)處理的一個類,不僅包含對請求參數(shù)的處理,還包含對實(shí)體的創(chuàng)建,為實(shí)體添加相關(guān)參數(shù)等方法的實(shí)現(xiàn)過程。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評論