`
苗振忠
  • 浏览: 51731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Volley===Volley框架的基本使用方法

阅读更多

现在开发app,可以说离不开网络操作,今天给大家介绍一下Android网络框架volley的使用方法。

volley简介

Volley主页https://android.googlesource.com/platform/frameworks/volley
Github地址https://github.com/mcxiaoke/android-volley

Volley:2013年Google I/O大会上推出的一个新的Android网络通信框架,能使网络通信更快,更简单,更健壮。

功能:
Json,图像等的异步下载
网络请求的排序(scheduling)
网络请求的优先级处理
缓存
多级别取消请求
和Activity生命周期联动(Activity结束时同时取消所有请求)

使用volley:
compile 'com.mcxiaoke.volley:library:1.0.19'

基本使用方法

StringRequest使用方法:

演示:通过StringRequest发送一个get请求

  1. privatevoidgetStringRequest(){
  2. Stringurl="http://api.k780.com:88/?app=phone.get&phone=13800138000&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
  3. RequestQueuequeue=Volley.newRequestQueue(this);
  4. StringRequestrequest=newStringRequest(url,newResponse.Listener<String>(){
  5. @Override
  6. publicvoidonResponse(Strings){
  7. Log.e("success",s);
  8. }
  9. },newResponse.ErrorListener(){
  10. @Override
  11. publicvoidonErrorResponse(VolleyErrorvolleyError){
  12. }
  13. });
  14. queue.add(request);
  15. }
演示:通过StringRequest发送一个post请求
  1. privatevoidpostStringRequest(){
  2. Stringurl="http://api.k780.com:88/?app=phone.get";
  3. RequestQueuequeue=Volley.newRequestQueue(this);
  4. StringRequestrequest=newStringRequest(Request.Method.POST,url,newResponse.Listener<String>(){
  5. @Override
  6. publicvoidonResponse(Strings){
  7. Log.e("sucess",s);
  8. }
  9. },newResponse.ErrorListener(){
  10. @Override
  11. publicvoidonErrorResponse(VolleyErrorvolleyError){
  12. }
  13. }){
  14. @Override
  15. protectedMap<String,String>getParams()throwsAuthFailureError{
  16. Map<String,String>map=newHashMap<>();
  17. map.put("phone","13800138000");
  18. map.put("appkey","10003");
  19. map.put("sign","b59bc3ef6191eb9f747dd4e83c99f2a4");
  20. map.put("format","json");
  21. map.put("idcard","110101199001011114");
  22. returnmap;
  23. }
  24. };
  25. queue.add(request);
  26. }

通过上述代码,我们可以总结出,StringRequest可以发送get和post请求,但是服务器返回的数据以String类型进行接收。
通过StringRequest发送请求一般需要以下三步:
1.创建一个请求队列RequestQueue
2.创建StringRequest对象
3.将请求对象添加到请求队列中

JsonRequest使用方法:
演示:通过JsonRequest发送一个get请求

  1. privatevoidgetJsonRequest(){
  2. Stringurl="http://api.k780.com:88/?app=phone.get&phone=13800138000&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
  3. RequestQueuequeue=Volley.newRequestQueue(this);
  4. JsonObjectRequestrequest=newJsonObjectRequest(url,newResponse.Listener<JSONObject>(){
  5. @Override
  6. publicvoidonResponse(JSONObjectjsonObject){
  7. Log.e("success",jsonObject.toString());
  8. }
  9. },newResponse.ErrorListener(){
  10. @Override
  11. publicvoidonErrorResponse(VolleyErrorvolleyError){
  12. }
  13. });
  14. queue.add(request);
  15. }

演示:通过JsonRequest发送一个post请求
  1. privatevoidpostJsonRequest(){
  2. Stringurl="http://api.k780.com:88/?app=phone.get";
  3. RequestQueuequeue=Volley.newRequestQueue(this);
  4. JsonObjectRequestrequest=newJsonObjectRequest(Request.Method.POST,url,newResponse.Listener<JSONObject>(){
  5. @Override
  6. publicvoidonResponse(JSONObjectjsonObject){
  7. Log.e("success",jsonObject.toString());
  8. }
  9. },newResponse.ErrorListener(){
  10. @Override
  11. publicvoidonErrorResponse(VolleyErrorvolleyError){
  12. }
  13. }){
  14. @Override
  15. protectedMap<String,String>getParams()throwsAuthFailureError{
  16. Map<String,String>map=newHashMap<>();
  17. map.put("phone","13800138000");
  18. map.put("appkey","10003");
  19. map.put("sign","b59bc3ef6191eb9f747dd4e83c99f2a4");
  20. map.put("format","json");
  21. map.put("idcard","110101199001011114");
  22. returnmap;
  23. }
  24. };
  25. queue.add(request);
  26. }

通过以上分析,可以发现,StringRequest和JsonObjectRequest用法基本一样,只是接收的数据类型不一样。
同理,JsonArrayRequest方法和上面的用法也差不多,这里不做过多介绍。

封装Volley:
具体实现功能如下:
发送get请求
发送post请求
加载网络图片
上传图片

Volley管理的类:

  1. /**
  2. *管理类
  3. *@authorYan
  4. */
  5. publicclassMyVolley{
  6. privatestaticfinalStringTAG="MyVolley";
  7. privatestaticMyVolleyinstance;
  8. //请求队列
  9. privatestaticRequestQueuemRequestQueue;
  10. //创建ImageLoader
  11. privatestaticImageLoadermImageLoader;
  12. //默认分配最大空间的几分之几
  13. privatefinalstaticintRATE=8;
  14. publicMyVolley(Contextcontext){
  15. //初始化请求队列(默认创建5个线程)
  16. mRequestQueue=Volley.newRequestQueue(context);
  17. //获取ActivityManager管理者
  18. ActivityManagermanager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
  19. intmaxSize=manager.getMemoryClass()/RATE;
  20. //初始化ImageLoader对象
  21. mImageLoader=newImageLoader(mRequestQueue,newBitmapLruCache(1024*1024*maxSize));
  22. Log.e(TAG,"MyVolley初始化完成");
  23. }
  24. /**
  25. *Volley的初始化操作,使用volley前必须调用此方法
  26. */
  27. publicstaticvoidinit(Contextcontext){
  28. if(instance==null){
  29. instance=newMyVolley(context);
  30. }
  31. }
  32. /**
  33. *获取消息队列
  34. */
  35. publicstaticRequestQueuegetRequestQueue(){
  36. throwIfNotInit();
  37. returnmRequestQueue;
  38. }
  39. /**
  40. *获取ImageLoader
  41. */
  42. publicstaticImageLoadergetImageLoader(){
  43. throwIfNotInit();
  44. returnmImageLoader;
  45. }
  46. /**
  47. *加入请求队列
  48. */
  49. publicstaticvoidaddRequest(Request<?>request){
  50. getRequestQueue().add(request);
  51. }
  52. /**
  53. *加载网络图片
  54. */
  55. publicstaticvoidgetImage(StringrequestUrl,ImageViewimageView){
  56. getImage(requestUrl,imageView,0,0);
  57. }
  58. /**
  59. *加载网络图片
  60. *
  61. */
  62. publicstaticvoidgetImage(StringrequestUrl,ImageViewimageView,
  63. intdefaultImageResId,interrorImageResId){
  64. getImage(requestUrl,imageView,defaultImageResId,errorImageResId,0,
  65. 0);
  66. }
  67. /**
  68. *加载网络图片
  69. *
  70. */
  71. publicstaticvoidgetImage(StringrequestUrl,ImageViewimageView,
  72. intdefaultImageResId,interrorImageResId,intmaxWidth,
  73. intmaxHeight){
  74. imageView.setTag(requestUrl);
  75. try{
  76. getImageLoader().get(
  77. requestUrl,
  78. ImageListenerFactory.getImageListener(imageView,
  79. defaultImageResId,errorImageResId),maxWidth,
  80. maxHeight);
  81. }catch(Exceptione){
  82. e.printStackTrace();
  83. }
  84. }
  85. /**
  86. *检查是否完成初始化
  87. */
  88. privatestaticvoidthrowIfNotInit(){
  89. if(instance==null){
  90. thrownewIllegalStateException("MyVolley尚未初始化,在使用前应该执行init()");
  91. }
  92. }
  93. }

通过以上代码,主要提供了下面几个方法:
1.在构造方法中,初始化一个全局的请求队列RequestQueue,初始化了一个ImageLoader。
2.获取消息队列
3.获取ImageLoader对象
4.将请求加入到消息队列中
5.加载图片
注意:使用MyVolley时,一定要在应用的全局的Application中进行初始化
MyVolley.init(getApplicationContext());

加载图片中涉及到的2个缓存类如下:

  1. /**
  2. *图片缓存类(Lru算法)
  3. *@authorYan
  4. *
  5. */
  6. publicclassBitmapLruCacheextendsLruCache<String,Bitmap>implementsImageCache{
  7. privatestaticfinalStringTAG="BitmapLruCache";
  8. //图片缓存的软引用
  9. privateBitmapSoftRefCachesoftRefCache;
  10. publicBitmapLruCache(intmaxSize){
  11. super(maxSize);
  12. //初始化BitmapSoftRefCache
  13. softRefCache=newBitmapSoftRefCache();
  14. }
  15. @Override
  16. protectedintsizeOf(Stringkey,Bitmapvalue){
  17. returnvalue.getRowBytes()*value.getHeight();
  18. }
  19. @Override
  20. protectedvoidentryRemoved(booleanevicted,Stringkey,BitmapoldValue,
  21. BitmapnewValue){
  22. if(evicted){
  23. //将bitmap添加到软引用的缓存中
  24. softRefCache.putBitmap(key,oldValue);
  25. }
  26. }
  27. /**
  28. *从缓存中获取图片
  29. */
  30. @Override
  31. publicBitmapgetBitmap(Stringurl){
  32. Bitmapbitmap=get(url);
  33. if(bitmap==null){
  34. //从软引用缓存中获取
  35. bitmap=softRefCache.getBitmap(url);
  36. }
  37. returnbitmap;
  38. }
  39. /**
  40. *将图片放入到缓存中
  41. */
  42. @Override
  43. publicvoidputBitmap(Stringurl,Bitmapbitmap){
  44. put(url,bitmap);
  45. }
  46. }

  1. /**
  2. *图片缓存管理类(软引用)
  3. *@authorYan
  4. *
  5. */
  6. publicclassBitmapSoftRefCacheimplementsImageCache{
  7. privatestaticfinalStringTAG="BitmapSoftRefCache";
  8. //创建一个集合保存Bitmap
  9. privateLinkedHashMap<String,SoftReference<Bitmap>>map;
  10. publicBitmapSoftRefCache(){
  11. map=newLinkedHashMap<>();
  12. }
  13. /**
  14. *根据图片url从缓存中拿出bitmap
  15. */
  16. @Override
  17. publicBitmapgetBitmap(Stringurl){
  18. Bitmapbitmap=null;
  19. SoftReference<Bitmap>softRef=map.get(url);
  20. if(softRef!=null){
  21. bitmap=softRef.get();
  22. if(bitmap==null){
  23. //从集合中移除
  24. map.remove(url);
  25. }
  26. }
  27. returnnull;
  28. }
  29. /**
  30. *把图片放进缓存中
  31. */
  32. @Override
  33. publicvoidputBitmap(Stringurl,Bitmapbitmap){
  34. SoftReference<Bitmap>softRef=newSoftReference<Bitmap>(bitmap);
  35. map.put(url,softRef);
  36. }
  37. }

  1. /**
  2. *图片加载状态监听
  3. *@authorYan
  4. *
  5. */
  6. publicclassImageListenerFactory{
  7. privatestaticfinalStringTAG="ImageListenerFactory";
  8. publicstaticImageListenergetImageListener(finalImageViewview,
  9. finalintdefaultImageResId,finalinterrorImageResId){
  10. returnnewImageListener(){
  11. @Override
  12. publicvoidonErrorResponse(VolleyErrorerror){
  13. if(errorImageResId!=0){
  14. view.setImageResource(errorImageResId);
  15. }
  16. }
  17. @Override
  18. publicvoidonResponse(ImageContainerresponse,booleanisImmediate){
  19. if(response.getBitmap()!=null){
  20. if(view.getTag().toString().equals(response.getRequestUrl())){
  21. view.setImageBitmap(response.getBitmap());
  22. }
  23. }
  24. elseif(defaultImageResId!=0){
  25. view.setImageResource(defaultImageResId);
  26. }
  27. }
  28. };
  29. }
  30. }

这里加载图片采用了LRU算法,然后配合软引用使用,这样会更好的对内存进行管理,代码中注释已经很详细,相信大家都可以理解。
  1. /**
  2. *返回成功监听(自定义处理逻辑)
  3. *@authorYan
  4. */
  5. publicabstractclassMyReponseListenerimplementsResponse.Listener<BaseVO>{
  6. @Override
  7. publicvoidonResponse(BaseVOarg0){
  8. onMyResponse(arg0);
  9. }
  10. publicbooleanonMyResponse(BaseVOt){
  11. //DialogMaker.closeProgressDialog();
  12. //自定义处理逻辑
  13. ...
  14. returntrue;
  15. }
  16. }
  1. /**
  2. *自定义返回错误信息监听
  3. *
  4. *@authorYan
  5. *
  6. */
  7. publicabstractclassMyErrorListenerimplementsErrorListener{
  8. publicvoidonErrorResponse(VolleyErrorerror){
  9. //自定义同意错误逻辑处理
  10. ...
  11. }
  12. }
下面提供一个请求服务器返回数据后封装成对象的一个GsonRequest:
  1. publicclassGsonRequestextendsRequest<BaseVO>{
  2. privatestaticfinalStringTAG="GsonRequest";
  3. //超时时间,默认10秒
  4. privateintdefaultHttpTimeOut=10*1000;
  5. //回调监听
  6. privateListener<BaseVO>listener;
  7. //返回类型
  8. privateTypetype;
  9. //请求参数
  10. privateMap<String,String>methodBody;
  11. /**
  12. *get请求
  13. *
  14. *@paramurl
  15. *@paramtype
  16. *@paramlistener
  17. *@paramerrorListener
  18. */
  19. publicGsonRequest(Stringurl,Typetype,Listener<BaseVO>listener,
  20. ErrorListenererrorListener){
  21. super(Method.GET,url,errorListener);
  22. //不启用缓存(默认是true)
  23. setShouldCache(false);
  24. this.type=type;
  25. this.listener=listener;
  26. //设置重连策略
  27. this.setRetryPolicy(newDefaultRetryPolicy(defaultHttpTimeOut,
  28. DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
  29. DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
  30. }
  31. /**
  32. *post请求
  33. *
  34. *@parammethodName
  35. *@parammethodBoby
  36. *@paramtype
  37. *@paramlistener
  38. *@paramerrorListener
  39. */
  40. publicGsonRequest(Stringurl,Map<String,String>methodBoby,Typetype,
  41. Listener<BaseVO>listener,ErrorListenererrorListener){
  42. super(Method.POST,url,errorListener);
  43. this.methodBody=methodBoby;
  44. this.listener=listener;
  45. this.type=type;
  46. //不启用缓存
  47. setShouldCache(false);
  48. //设置重连策略
  49. this.setRetryPolicy(newDefaultRetryPolicy(defaultHttpTimeOut,
  50. DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
  51. DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
  52. }
  53. /**
  54. *设置请求参数
  55. */
  56. @Override
  57. protectedMap<String,String>getParams()throwsAuthFailureError{
  58. if(methodBody==null){
  59. returnsuper.getParams();
  60. }
  61. //创建一个集合,保存请求参数
  62. Map<String,String>map=newLinkedHashMap<>();
  63. //----此处可以添加多个通用参数
  64. //map.put(key,value);
  65. //------
  66. //------
  67. //遍历集合
  68. Iterator<Entry<String,String>>iter=methodBody.entrySet().iterator();
  69. while(iter.hasNext()){
  70. Entry<String,String>entry=iter.next();
  71. map.put(entry.getKey(),entry.getValue());
  72. }
  73. returnmap;
  74. }
  75. /**
  76. *将服务器返回的原生字节内容进行转换
  77. */
  78. @Override
  79. protectedResponse<BaseVO>parseNetworkResponse(NetworkResponseresponse){
  80. try{
  81. //获取返回的数据(在Content-Type首部中获取编码集,如果没有找到,默认返回ISO-8859-1)
  82. StringjsonString=newString(response.data,
  83. HttpHeaderParser.parseCharset(response.headers));
  84. returnResponse.success(parseNetworkResponseDelegate(jsonString),
  85. HttpHeaderParser.parseCacheHeaders(response));
  86. }catch(Exceptione){
  87. returnResponse.error(newParseError(e));
  88. }
  89. }
  90. /**
  91. *将服务器返回的内容用gson进行封装
  92. */
  93. privateBaseVOparseNetworkResponseDelegate(StringjsonString){
  94. returnnewGson().fromJson(jsonString,type);
  95. }
  96. /**
  97. *将解析后的数据进行回调
  98. */
  99. @Override
  100. protectedvoiddeliverResponse(BaseVOarg0){
  101. listener.onResponse(arg0);
  102. }
  103. }

下面提供一个请求服务器返回XML格式数据后的一个XMLRequest:
  1. **
  2. *服务器以XML格式返回数据
  3. *@authorYan
  4. */
  5. publicclassXMLRequestextendsRequest<XmlPullParser>{
  6. privateListener<XmlPullParser>mListener;
  7. publicXMLRequest(intmethod,Stringurl,Listener<XmlPullParser>listener,
  8. ErrorListenererrorListener){
  9. super(method,url,errorListener);
  10. //不启用缓存
  11. setShouldCache(false);
  12. mListener=listener;
  13. }
  14. publicXMLRequest(Stringurl,Listener<XmlPullParser>listener,ErrorListenererrorListener){
  15. this(Method.GET,url,listener,errorListener);
  16. }
  17. /**
  18. *解析服务器返回的数据
  19. */
  20. @Override
  21. protectedResponse<XmlPullParser>parseNetworkResponse(
  22. NetworkResponseresponse){
  23. try{
  24. StringxmlString=newString(response.data,
  25. HttpHeaderParser.parseCharset(response.headers));
  26. //创建解析工厂
  27. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  28. //获取解析器
  29. XmlPullParserxmlPullParser=factory.newPullParser();
  30. //设置解析数据
  31. xmlPullParser.setInput(newStringReader(xmlString));
  32. returnResponse.success(xmlPullParser,HttpHeaderParser.parseCacheHeaders(response));
  33. }catch(UnsupportedEncodingExceptione){
  34. returnResponse.error(newParseError(e));
  35. }catch(XmlPullParserExceptione){
  36. returnResponse.error(newParseError(e));
  37. }
  38. }
  39. /**
  40. *分发结果
  41. */
  42. @Override
  43. protectedvoiddeliverResponse(XmlPullParserresponse){
  44. mListener.onResponse(response);
  45. }
  46. }

下面提供一个文件上传(支持多文件)的一个PostUploadRequest:
  1. publicclassPostUploadRequestextendsRequest<String>{
  2. /**
  3. *正确数据的时候回掉用
  4. */
  5. privateListenermListener;
  6. /*请求数据通过参数的形式传入*/
  7. privateList<FormImage>mListItem;
  8. privateStringBOUNDARY="--------------520-13-14";//数据分隔线
  9. privateStringMULTIPART_FORM_DATA="multipart/form-data";
  10. publicPostUploadRequest(Stringurl,List<FormImage>listItem,Listener<String>listener,
  11. ErrorListenererrorListener){
  12. super(Method.POST,url,errorListener);
  13. this.mListener=listener;
  14. setShouldCache(false);
  15. mListItem=listItem;
  16. //设置请求的响应事件,因为文件上传需要较长的时间,所以在这里加大了,设为10秒
  17. setRetryPolicy(newDefaultRetryPolicy(10*1000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
  18. }
  19. /**
  20. *这里开始解析数据
  21. *@paramresponseResponsefromthenetwork
  22. *@return
  23. */
  24. @Override
  25. protectedResponse<String>parseNetworkResponse(NetworkResponseresponse){
  26. try{
  27. StringmString=
  28. newString(response.data,HttpHeaderParser.parseCharset(response.headers));
  29. returnResponse.success(mString,
  30. HttpHeaderParser.parseCacheHeaders(response));
  31. }catch(UnsupportedEncodingExceptione){
  32. returnResponse.error(newParseError(e));
  33. }
  34. }
  35. /**
  36. *回调正确的数据
  37. *@paramresponseTheparsedresponsereturnedby
  38. */
  39. @Override
  40. protectedvoiddeliverResponse(Stringresponse){
  41. mListener.onResponse(response);
  42. }
  43. @Override
  44. publicbyte[]getBody()throwsAuthFailureError{
  45. if(mListItem==null||mListItem.size()==0){
  46. returnsuper.getBody();
  47. }
  48. ByteArrayOutputStreambos=newByteArrayOutputStream();
  49. intN=mListItem.size();
  50. for(inti=0;i<N;i++){
  51. FormImageformImage=mListItem.get(i);
  52. StringBuffersb=newStringBuffer();
  53. /*第一行*/
  54. //`"--"+BOUNDARY+"\r\n"`
  55. sb.append("--"+BOUNDARY);
  56. sb.append("\r\n");
  57. /*第二行*/
  58. //Content-Disposition:form-data;name="参数的名称";filename="上传的文件名"+"\r\n"
  59. sb.append("Content-Disposition:form-data;");
  60. sb.append("name=\"");
  61. sb.append(formImage.getName());
  62. sb.append("\"");
  63. sb.append(";filename=\"");
  64. sb.append(formImage.getFileName());
  65. sb.append("\"");
  66. sb.append("\r\n");
  67. /*第三行*/
  68. //Content-Type:文件的mime类型+"\r\n"
  69. sb.append("Content-Type:");
  70. sb.append(formImage.getMime());
  71. sb.append("\r\n");
  72. /*第四行*/
  73. //"\r\n"
  74. sb.append("\r\n");
  75. try{
  76. bos.write(sb.toString().getBytes("utf-8"));
  77. /*第五行*/
  78. //文件的二进制数据+"\r\n"
  79. bos.write(formImage.getValue());
  80. bos.write("\r\n".getBytes("utf-8"));
  81. }catch(IOExceptione){
  82. e.printStackTrace();
  83. }
  84. }
  85. /*结尾行*/
  86. //`"--"+BOUNDARY+"--"+"\r\n"`
  87. StringendLine="--"+BOUNDARY+"--"+"\r\n";
  88. try{
  89. bos.write(endLine.toString().getBytes("utf-8"));
  90. }catch(IOExceptione){
  91. e.printStackTrace();
  92. }
  93. returnbos.toByteArray();
  94. }
  95. //Content-Type:multipart/form-data;boundary=----------8888888888888
  96. @Override
  97. publicStringgetBodyContentType(){
  98. returnMULTIPART_FORM_DATA+";boundary="+BOUNDARY;
  99. }
  100. }

上传文件的FormImage类如下:
  1. publicclassFormImage{
  2. //参数的名称
  3. privateStringname;
  4. //文件名
  5. privateStringfileName;
  6. //文件的mine
  7. privateStringmime;
  8. //需要上传的文件
  9. privateFilefile;
  10. publicFormImage(){
  11. }
  12. publicFilegetFile(){
  13. returnfile;
  14. }
  15. publicvoidsetFile(Filefile){
  16. this.file=file;
  17. }
  18. publicStringgetMime(){
  19. returnmime;
  20. }
  21. publicvoidsetMime(Stringmime){
  22. this.mime=mime;
  23. }
  24. publicStringgetFileName(){
  25. returnfileName;
  26. }
  27. publicvoidsetFileName(StringfileName){
  28. this.fileName=fileName;
  29. }
  30. publicStringgetName(){
  31. returnname;
  32. }
  33. publicvoidsetName(Stringname){
  34. this.name=name;
  35. }
  36. //对文件进行二进制转换
  37. publicbyte[]getValue(){
  38. byte[]buffer=null;
  39. try{
  40. FileInputStreamfis=newFileInputStream(file);
  41. ByteArrayOutputStreambos=newByteArrayOutputStream(1024);
  42. byte[]b=newbyte[1024];
  43. intn;
  44. while((n=fis.read(b))!=-1){
  45. bos.write(b,0,n);
  46. }
  47. fis.close();
  48. bos.close();
  49. buffer=bos.toByteArray();
  50. }catch(FileNotFoundExceptione){
  51. e.printStackTrace();
  52. }catch(IOExceptione){
  53. e.printStackTrace();
  54. }
  55. returnbuffer;
  56. }

下面演示如何使用封装后的方法进行网络请求:
1.发送get请求:
  1. privatevoidgetMyVolley(){
  2. Stringurl="http://api.k780.com:88/?app=idcard.get&idcard=110101199001011114&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
  3. GsonRequestrequest=newGsonRequest(url,PersonInfoBean.class,newMyReponseListener(){
  4. @Override
  5. publicvoidonResponse(BaseVOt){
  6. super.onResponse(t);
  7. PersonInfoBeanbean=(PersonInfoBean)t;
  8. Log.e("success",bean.toString());
  9. }
  10. },newMyErrorListener(){
  11. @Override
  12. publicvoidonErrorResponse(VolleyErrorerror){
  13. super.onErrorResponse(error);
  14. }
  15. });
  16. MyVolley.addRequest(request);
  17. }

2.发送post请求:
  1. privatevoidpostMyVolley(){
  2. Stringurl="http://api.k780.com:88/?app=idcard.get";
  3. Map<String,String>map=newHashMap<>();
  4. map.put("appkey","10003");
  5. map.put("sign","b59bc3ef6191eb9f747dd4e83c99f2a4");
  6. map.put("format","json");
  7. map.put("idcard","110101199001011114");
  8. GsonRequestrequest=newGsonRequest(url,map,PersonInfoBean.class,newMyReponseListener(){
  9. @Override
  10. publicvoidonResponse(BaseVOvo){
  11. super.onResponse(vo);
  12. PersonInfoBeanbean=(PersonInfoBean)vo;
  13. Log.e("sucess",bean.toString());
  14. }
  15. },newMyErrorListener(){
  16. @Override
  17. publicvoidonErrorResponse(VolleyErrorerror){
  18. super.onErrorResponse(error);
  19. }
  20. });
  21. MyVolley.addRequest(request);
  22. }


3.上传多文件演示:
  1. //上传文件路径
  2. Stringurl="http://192.168.1.107:8080/FileUpload/FileServlet";
  3. List<FormImage>list=newArrayList<>();
  4. Stringpath1=Environment.getExternalStorageDirectory().getPath()+File.separator+"ss.png";
  5. Stringpath2=Environment.getExternalStorageDirectory().getPath()+File.separator+"ic_launcher.png";
  6. Filefile1=newFile(path1);
  7. Filefile2=newFile(path2);
  8. FormImagef1=newFormImage();
  9. f1.setFile(file1);
  10. f1.setFileName("t1");
  11. f1.setName("file1");
  12. f1.setMime("image/png");
  13. list.add(f1);
  14. FormImagef2=newFormImage();
  15. f2.setFile(file2);
  16. f2.setFileName("t2");
  17. f2.setName("file2");
  18. f2.setMime("image/png");
  19. list.add(f2);
  20. PostUploadRequestrequest=newPostUploadRequest(url,list,newResponse.Listener<String>(){
  21. @Override
  22. publicvoidonResponse(Strings){
  23. Log.e("success",s);
  24. }
  25. },newResponse.ErrorListener(){
  26. @Override
  27. publicvoidonErrorResponse(VolleyErrorvolleyError){
  28. }
  29. });
  30. MyVolley.addRequest(request);
  31. }


4.发送请求,服务器返回XML:
  1. privatevoidgetXml(){
  2. Stringurl="http://flash.weather.com.cn/wmaps/xml/china.xml";
  3. XMLRequestrequest=newXMLRequest(url,newResponse.Listener<XmlPullParser>(){
  4. @Override
  5. publicvoidonResponse(XmlPullParserxmlPullParser){
  6. try{
  7. inteventType=xmlPullParser.getEventType();
  8. while(eventType!=XmlPullParser.END_DOCUMENT){
  9. switch(eventType){
  10. caseXmlPullParser.START_TAG:
  11. StringnodeName=xmlPullParser.getName();
  12. if("city".equals(nodeName)){
  13. StringpName=xmlPullParser.getAttributeValue(0);
  14. Log.e("TAG","cityis"+pName);
  15. }
  16. break;
  17. }
  18. eventType=xmlPullParser.next();
  19. }
  20. }catch(Exceptione){
  21. e.printStackTrace();
  22. }
  23. }
  24. },newResponse.ErrorListener(){
  25. @Override
  26. publicvoidonErrorResponse(VolleyErrorvolleyError){
  27. }
  28. });
  29. MyVolley.addRequest(request);
  30. }

4.利用ImageLoader加载图片:
  1. publicclassMyAdapterextendsBaseAdapter{
  2. privateContextcontext;
  3. privateList<Person>list;
  4. privateLayoutInflatermInflater;
  5. publicViewHolderholder;
  6. publicMyAdapter(Contextcontext,List<Person>list){
  7. this.context=context;
  8. this.list=list;
  9. this.mInflater=LayoutInflater.from(context);
  10. }
  11. @Override
  12. publicintgetCount(){
  13. returnlist.size();
  14. }
  15. @Override
  16. publicObjectgetItem(intposition){
  17. returnlist.get(position);
  18. }
  19. @Override
  20. publiclonggetItemId(intposition){
  21. returnposition;
  22. }
  23. @Override
  24. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  25. holder=null;
  26. if(convertView==null){
  27. convertView=mInflater.inflate(R.layout.itemone,null);
  28. holder=newViewHolder();
  29. holder.iv_image=(ImageView)convertView.findViewById(R.id.iv_image);
  30. holder.tv_name=(TextView)convertView.findViewById(R.id.tv_name);
  31. convertView.setTag(holder);
  32. }
  33. else{
  34. holder=(ViewHolder)convertView.getTag();
  35. }
  36. Personbean=list.get(position);
  37. holder.tv_name.setText(bean.getName());
  38. MyVolley.getImage(bean.getImgUrl(),holder.iv_image,R.mipmap.ic_launcher,R.mipmap.ic_launcher,150,150);
  39. returnconvertView;
  40. }
  41. classViewHolder{
  42. privateTextViewtv_name;
  43. privateImageViewiv_image;
  44. }
  45. }


上面主要介绍了如何封装Volley,并且如何使用封装后的MyVolley进行网络请求。
演示:

今天说了这么多,相信大家一定对Volley可以达到基本掌握的情况了,本篇文章主要是从实战角度出发,主要是让大家体验一下volley的框架封装的用法,volley的源码本篇文章没有涉及到,但是这完全不影响大家使用volley,后续有时间我会从源码角度进行分析volley,说了这么多,有点饿了,今天就说到这里了,大家快快练习一下Volley的操作吧~!

源码链接:http://download.csdn.net/detail/a1002450926/9379197
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics