大佬教程收集整理的这篇文章主要介绍了Android AndBase框架使用封装好的函数完成Http请求(三),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
本文是针对AndBase框架学习整理的第三篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习。
学习内容:
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请求
一般普通的网络请求如果不@R_521_9446@信息的变化,也就是不涉及一些安全性问题,都可以使用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.setMax@R_662_10586@lConnections(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 @R_662_10586@lSizE){ max_tv.setText(bytesWritten/(@R_662_10586@lSize/maX)+"/"+maX); progressBar.setProgress(bytesWritten/(@R_662_10586@lSize/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,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,new FileSendResponseListener(this,progressBar)); }
这里的监听事件简单的粘贴一下...监听事件之所以传递控件..是为了更好的向@L_450_72@进行展示...这里设置了一个进度条的方式,来贯穿整个请求――响应的过程...如果下载或者是上传的文件和资源过多...我们是必须通知@L_450_72@相关进度的..总不能一直卡死在界面上..这样@L_450_72@也无法知道到底是否完成了数据的上传或者是下载...
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,String content){ activity.showToast("Onsuccess"); System.out.println(content); } @Override public void onFailure(int statusCode,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("正在下载",int @R_662_10586@lSizE){ max_tv.setText(bytesWritten/(@R_662_10586@lSize/maX)+"/"+maX); progressBar.setProgress(bytesWritten/(@R_662_10586@lSize/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 则是对请求参数处理的一个类,不仅包含对请求参数的处理,还包含对实体的创建,为实体添加相关参数等方法的实现过程。
以上就是本文的全部内容,希望对大家的学习有所帮助。
以上是大佬教程为你收集整理的Android AndBase框架使用封装好的函数完成Http请求(三)全部内容,希望文章能够帮你解决Android AndBase框架使用封装好的函数完成Http请求(三)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。