Android AndBase框架使用封裝好的函數(shù)完成Http請(qǐng)求(三)
本文是針對(duì)AndBase框架學(xué)習(xí)整理的第三篇筆記,想要了解AndBase框架的朋友可以閱讀本文,大家共同學(xué)習(xí)。
學(xué)習(xí)內(nèi)容:
1.使用AndBase框架實(shí)現(xiàn)無(wú)參Http Get請(qǐng)求...
2.使用AndBase框架實(shí)現(xiàn)有參Http Post請(qǐng)求...
3.使用AndBase框架實(shí)現(xiàn)有參Http Get請(qǐng)求...
AndBase框架為我們提供了一些相關(guān)的方法提供給我們使用,用來(lái)完成Http網(wǎng)絡(luò)請(qǐng)求...總體就是對(duì)Http請(qǐng)求的一個(gè)封裝,不過(guò)個(gè)人認(rèn)為,網(wǎng)絡(luò)請(qǐng)求這一模塊更加推薦使用Volley框架..樓主對(duì)比了兩個(gè)框架中的源碼...Volley更多的地方是使用抽象方法封裝在接口內(nèi),然后對(duì)外暴露接口,其他類(lèi)在實(shí)現(xiàn)接口的同時(shí)需要實(shí)現(xiàn)內(nèi)部的抽象方法...而AndBase則是使用繼承的方式..繼承父類(lèi)..實(shí)現(xiàn)類(lèi)通過(guò)重寫(xiě)的方式對(duì)封裝的方法重寫(xiě)從而進(jìn)行下一步的操作...
相比二者網(wǎng)絡(luò)請(qǐng)求的源碼,Volley源碼的書(shū)寫(xiě)還是更勝一籌...Volley是Google推出的,針對(duì)的也僅僅是網(wǎng)絡(luò)請(qǐng)求這一模塊...同樣AndBase也是非常優(yōu)秀的,是國(guó)內(nèi)牛人寫(xiě)的一款重量級(jí)框架,涉及的模塊非常的廣泛,還是非常好用的...
1.使用AndBase框架實(shí)現(xiàn)無(wú)參Http Get請(qǐng)求
一般普通的網(wǎng)絡(luò)請(qǐng)求如果不涉及到數(shù)據(jù)信息的變化,也就是不涉及一些安全性問(wèn)題,都可以使用Get方式來(lái)完成網(wǎng)絡(luò)請(qǐng)求...Get請(qǐng)求也是分為有參和無(wú)參的,給我的感覺(jué)有參一般可以用于向服務(wù)器上傳資源數(shù)據(jù)...先介紹一下無(wú)參的Get請(qǐng)求...還是先從源碼的地方來(lái)看看...
源碼的調(diào)用方式是先使用AbHttpUtils.get()函數(shù)調(diào)用...不過(guò)這無(wú)關(guān)緊要...通過(guò)這個(gè)方法走向AbHttpClient類(lèi)內(nèi)部...執(zhí)行下面這段源碼...無(wú)論是有參還是無(wú)參..都會(huì)調(diào)用這個(gè)方法..無(wú)參的時(shí)候第二個(gè)參數(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ù)首先通過(guò)Handler發(fā)送Message...同時(shí)開(kāi)啟一個(gè)線(xiàn)程池,來(lái)提交當(dāng)前的請(qǐng)求,最后將執(zhí)行doGet()方法,同時(shí)Handler一直對(duì)responseListener的消息進(jìn)行處理..doGet()方法的源碼過(guò)程如下
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連接對(duì)象 if(params!=null){ url += params.getParamString(); //如果有參,那么獲取相關(guān)參數(shù)... } HttpGet httpRequest = new HttpGet(url); //定義連接對(duì)象.. BasicHttpParams httpParams = new BasicHttpParams(); // 從連接池中取連接的超時(shí)時(shí)間,設(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ù)的超時(shí)時(shí)間 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è)置請(qǐng)求參數(shù) httpRequest.setParams(httpParams); //取得HttpClient對(duì)象 HttpClient httpClient = new DefaultHttpClient(); //請(qǐng)求HttpClient,取得HttpResponse HttpResponse httpResponse = httpClient.execute(httpRequest); //請(qǐng)求成功 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)用過(guò)程其實(shí)就非常的清晰了..
無(wú)論是doGet()方法還是doPost()方法模式基本是相同的,都是需要先建立一個(gè)連接對(duì)象,HttpGet或HttpPost..不同之處在于有參的Get請(qǐng)求直接將params加入到url后面即可,而Post請(qǐng)求需要獲取實(shí)體數(shù)據(jù)..在實(shí)體數(shù)據(jù)中加入我們傳遞的params..設(shè)置連接過(guò)程和讀取數(shù)據(jù)過(guò)程中的相關(guān)參數(shù),比如說(shuō)超時(shí)的時(shí)間,使用的Http版本,設(shè)置UserAgent等等...設(shè)置完之后執(zhí)行請(qǐng)求獲取響應(yīng)了...
中間涉及到了一個(gè)判斷的過(guò)程..判斷返回的響應(yīng)數(shù)據(jù)到底屬于什么類(lèi)型的數(shù)據(jù),是基本的String類(lèi)型,還是與圖片或者視頻相關(guān)的Byte類(lèi)型,還是與文件相關(guān)的File類(lèi)型...通過(guò)對(duì)相關(guān)類(lèi)型的判斷,執(zhí)行不同的方法,雖然方法不相同,但是最后的目的是一樣的,都是把實(shí)體數(shù)據(jù)進(jìn)行封裝...封裝完畢后調(diào)用sendSuccessMessage然后Handler自動(dòng)回去處理Message...最后調(diào)用OnSuccess方法..將數(shù)據(jù)返回給客戶(hù)端..
還是看一下實(shí)際的調(diào)用過(guò)程:
無(wú)參的Get請(qǐng)求調(diào)度,這里需要設(shè)置相應(yīng)監(jiān)聽(tīng):
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
對(duì)響應(yīng)的監(jiān)聽(tīng)的一個(gè)重寫(xiě)過(guò)程...通過(guò)為請(qǐng)求設(shè)置上url+相關(guān)監(jiān)聽(tīng)就能夠完成網(wǎng)絡(luò)請(qǐng)求,并對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行相關(guān)處理了...這里完成了一個(gè)圖片數(shù)據(jù)的下載,然后通過(guò)對(duì)數(shù)據(jù)進(jìn)行封裝,就成了一個(gè)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請(qǐng)求
其實(shí)調(diào)用的方式都是相同的,,只不過(guò)Post請(qǐng)求需要傳遞相關(guān)的參數(shù)...使用有參的Post請(qǐng)求...這里是向一個(gè)JSP傳遞相關(guān)參數(shù)來(lái)完成數(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頁(yè)面的代碼..相關(guān)的JSP代碼如下...這里的JSP代碼非常的簡(jiǎn)單..并且前面在使用Volley的時(shí)候也使用過(guò)..JSP頁(yè)面我們完全可以自己書(shū)寫(xiě)的更加復(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請(qǐng)求
有參的Get請(qǐng)求一般用于文件,數(shù)據(jù)資源的上傳...將上傳的資源以及名稱(chēng)作為參數(shù)傳遞給服務(wù)器..這里不涉及安全上的問(wèn)題..因此可以使用帶有參數(shù)的Get請(qǐng)求...這里向服務(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)聽(tīng)事件簡(jiǎn)單的粘貼一下...監(jiān)聽(tīng)事件之所以傳遞控件..是為了更好的向用戶(hù)進(jìn)行展示...這里設(shè)置了一個(gè)進(jìn)度條的方式,來(lái)貫穿整個(gè)請(qǐng)求——響應(yīng)的過(guò)程...如果下載或者是上傳的文件和資源過(guò)多...我們是必須通知用戶(hù)相關(guān)進(jìn)度的..總不能一直卡死在界面上..這樣用戶(hù)也無(wú)法知道到底是否完成了數(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; } }
涉及到的類(lèi)為com.ab.http保內(nèi)的所有類(lèi)...
1.AbStringHttpResponseListener.java
2.AbBinaryHttpResponseListener.java
3.AbFileHttpResponseListener.java
這三個(gè)類(lèi)是對(duì)AbHttpResponseListener.java的一個(gè)繼承...繼承了其內(nèi)部的一些相關(guān)方法..包括請(qǐng)求開(kāi)始,結(jié)束,失敗等等函數(shù)...
AbHttpClient.java就是用來(lái)完成請(qǐng)求——連接過(guò)程的實(shí)現(xiàn)...其中還包含數(shù)據(jù)的封裝;
AbHttpUtils.java則是對(duì)post,get等方法調(diào)用的一個(gè)中間層;
AbRequestParams.java 則是對(duì)請(qǐng)求參數(shù)處理的一個(gè)類(lèi),不僅包含對(duì)請(qǐng)求參數(shù)的處理,還包含對(duì)實(shí)體的創(chuàng)建,為實(shí)體添加相關(guān)參數(shù)等方法的實(shí)現(xiàn)過(guò)程。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- 六款值得推薦的android(安卓)開(kāi)源框架簡(jiǎn)介
- Android Retrofit 2.0框架上傳圖片解決方案
- 簡(jiǎn)略分析Android的Retrofit應(yīng)用開(kāi)發(fā)框架源碼
- 舉例講解Android應(yīng)用開(kāi)發(fā)中OTTO框架的基本使用
- Android通用流行框架大全【整理】
- Android之使用Android-query框架開(kāi)發(fā)實(shí)戰(zhàn)(二)
- Android中XUtils3框架使用方法詳解(一)
- Android最基本的異步網(wǎng)絡(luò)請(qǐng)求框架
- Android學(xué)習(xí)之Flux架構(gòu)入門(mén)
相關(guān)文章
Flutter 設(shè)置全局字體的實(shí)現(xiàn)
本文主要介紹了Flutter 設(shè)置全局字體的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android開(kāi)發(fā)實(shí)現(xiàn)切換主題及換膚功能示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)切換主題及換膚功能,涉及Android界面布局與樣式動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03Android自定義控件實(shí)現(xiàn)滑動(dòng)開(kāi)關(guān)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)滑動(dòng)開(kāi)關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Android開(kāi)發(fā)中Google為什么不讓用Handler的runWithScissors()
這篇文章主要介紹了Android開(kāi)發(fā)中Google為什么不讓用Handler的runWithScissors(),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Android錄音功能的實(shí)現(xiàn)以及踩坑實(shí)戰(zhàn)記錄
在Android 開(kāi)發(fā)過(guò)程中,有些功能是通用的,或者是多個(gè)業(yè)務(wù)方都需要使用的,下面這篇文章主要給大家介紹了關(guān)于Android錄音功能的實(shí)現(xiàn)以及踩坑的相關(guān)資料,需要的朋友可以參考下2022-06-06Android中ListView Item布局優(yōu)化技巧
這篇文章主要介紹了Android中ListView Item布局優(yōu)化技巧,以實(shí)例形式分析了ListView Item布局的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android自定義控件實(shí)現(xiàn)簡(jiǎn)單寫(xiě)字板功能
這篇文章主要介紹了Android自定義控件實(shí)現(xiàn)簡(jiǎn)單寫(xiě)字板功能的相關(guān)資料,需要的朋友可以參考下2016-04-04