Volley与XUtils网络请求使用对比,心得,两者基本使用

之前一直使用的Volley作为网络请求框架,它是Google 在2013年的I/O大会 上,发布的。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,同时扩展性很强。在用它之前我进行了简单的封装,因为Volley默认的请求线程生命周期伴随着Activity的周期,这有时并不能满足项目需要,so上代码:

  1     <span style="font-size:14px;"><span style="font-size:14px;">public class VolleyController extends Application
  2     {
  3         /*
  4          * 网络请求TAG标签
  5          */
  6         public static final String TAG = "VolleyPatterns";
  7
  8         /*
  9          * 创建请求队列
 10          */
 11         private RequestQueue requestQueue;
 12
 13         /*
 14          * 创建单例模式对象
 15          */
 16         private static VolleyController volleyController;
 17
 18         private Context context;
 19
 20         @Override
 21         public void onCreate()
 22         {
 23             super.onCreate();
 24             volleyController = this;
 25         }
 26
 27         /**
 28          * 获得VolleyConroller的单例对象
 29          */
 30         public static synchronized VolleyController getInstance()
 31         {
 32             if (volleyController != null)
 33             {
 34
 35                 return volleyController;
 36             }
 37             else
 38             {
 39                 return volleyController = new VolleyController();
 40             }
 41         }
 42
 43         /**
 44          * 获得消息队列对象
 45          *
 46          * @return
 47          */
 48         public RequestQueue getRequestQueue(Context context)
 49         {
 50             this.context = context;
 51             if (requestQueue == null)
 52             {
 53                 synchronized (VolleyController.class)
 54                 {
 55                     if (requestQueue == null)
 56                     {
 57                         // LogUtils.i(TAG, "------getApplicationContext------" + getApplicationContext());
 58                         requestQueue = Volley.newRequestQueue(context);
 59                     }
 60                 }
 61
 62             }
 63             return requestQueue;
 64
 65         }
 66
 67         /**
 68          * 将请求放入消息队列中,tag是每个请求在消息队列的标签,方便对其经行控制
 69          *
 70          * @param request
 71          * @param tag
 72          */
 73         public <T> void addToRequestQuere(Request<T> request, String tag)
 74         {
 75             request.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
 76             VolleyLog.d("Adding request to queue: %s", request.getUrl());
 77             getRequestQueue(context).add(request);
 78         }
 79
 80         /**
 81          * 将请求放入消息队列中,tag是使用的是默认标签
 82          *
 83          * @param request
 84          * @param tag
 85          */
 86         public <T> void addToRequestQuere(Request<T> request)
 87         {
 88             request.setTag(TAG);
 89             getRequestQueue(context).add(request);
 90             LogUtils.i(TAG, "网络请求已发出");
 91
 92         }
 93
 94         /**
 95          * 通过tag取消网络请求对像
 96          *
 97          * @param tag
 98          */
 99
100         public void canclePendingRequest(Object tag)
101         {
102             if (requestQueue != null)
103             {
104                 requestQueue.cancelAll(tag);
105                 LogUtils.i(TAG, "网络请求已取消");
106             }
107         }</span>
108     }</span>  

里面的注释比较清楚,就不一一赘述了。在第一次进行网络请求时构建线程池,以后请求只是将Request对象放入线程池即可。不过这样是有风险的,如 果程序在运行中崩溃,后面就会连续崩溃,一直闪退到创建线程池的那个界面。不过也可以在每次网络请求时都创建一个消息队列,但是想想每进行网络请求都创建 一个线程池是多么奢侈,而且也会浪费不必要的资源。Volley中StringRequest其实是在项目中是用的比较多的,下面就是我使用 StringRequest示例:

 1     <span style="font-size:14px;"> /**
 2          * 意见反馈接口
 3          */
 4         private void userFeedbackTask()
 5         {
 6             StringRequest stringRequest = new StringRequest(Request.Method.POST(请求类型), feedback(网络请求地址), new Listener<String>()
 7             {
 8
 9                 @Override
10                 public void onResponse(String response)
11                 {
12                     Gson gson = new Gson();
13                     OutJsonArrayJson outJsonArrayJson = gson.fromJson(response, new TypeToken<OutJsonArrayJson>()
14                     {
15                     }.getType());
16                     if (outJsonArrayJson.getCode() == 200)
17                     {
18                         // 退出该页面
19                         AppManager.getAppManager().finishActivity(getCurActivity());
20                         ToastManagerUtils.show("反馈成功", getCurActivity());
21                     }
22                     ToastManagerUtils.show(outJsonArrayJson.getMsg(), getCurActivity());
23                     dialog.dismiss();
24                 }
25             }, new ErrorListenerCallBack())
26             {
27                 @Override
28                 protected Map<String, String> getParams()
29                     throws AuthFailureError
30                 {
31                     Map<String, String> map = new HashMap<String, String>();
32                     map.put("uid",
33                         SharedPreferencesUtils.GetUserLoginDatailsValue(getCurActivity(), "GatherLuckUserDetails", "uid"));
34
35                     map.put("pwd",
36                         SharedPreferencesUtils.GetUserLoginDatailsValue(getCurActivity(), "GatherLuckUserDetails", "pwd"));
37
38                     map.put("content", edActivityFeedbackInput.getText().toString().trim());
39                     LogUtils.i(TAG,"意见反馈接口参数---->"+map.toString());
40                     return map;
41                 }
42             };
43             VolleyController.getInstance().addToRequestQuere(stringRequest);
44         }</span>  

这是我项目中的一个"意见反馈接口"例子,写的一般希望大家多提意见。下来再看看请求图片示例:

 1     <span style="font-size:14px;">/**
 2          * 获得用户头像
 3          */
 4         private void getNetWorkImage(final String url)
 5         {
 6             /**
 7              * 使用ImageRequest加载网络图片
 8              */
 9             ImageRequest imageRequest = new ImageRequest(url, new Listener<Bitmap>()
10             {
11
12                 @Override
13                 public void onResponse(Bitmap response)
14                 {
15                     rimgActivityDetailsOfMineHeadImage.setImageBitmap(response);
16                 }
17             }, 60, 100, Config.ARGB_8888, new ErrorListenerCallBack());
18             VolleyController.getInstance().addToRequestQuere(imageRequest);
19         }</span>  

这是我项目中获取用户头像的例子,将网络图片地址传入,返回Bitmap对象,这里 Bitmap默认32位ARGB位图,位图数越高,图片越逼真。60为Bitmap最大宽度,100为最大高度。以上就是Volley在项目中经常使用的 地方。不过比较悲催的一点是:Volley没有直接的文件上传请求,不过可以扩展的,网上有封装好的。

下来我就说一下xUtils的基本使用,其实说起Xutils它很不错,但我不太习惯,用起来总感觉碍手碍脚的。各种封装的都很好,包含DbUtils模块,ViewUtils模块,HttpUtils模块,BitmapUtils模块。

因为它封装的比较完善,我用的时候只是封装了BitmapUtils。上代码:

 1     <span style="font-size:14px;"> private void submitFeedbackTask()
 2         {
 3            try{
 4
 5             RequestParams requestParams = new RequestParams();
 6             requestParams.addBodyParameter("act", "feedback");
 7             requestParams.addBodyParameter("content", edActivityFeedbackInput.getText().toString().trim());
 8             HttpUtils httpUtils = new HttpUtils();
 9             httpUtils.send(HttpMethod.POST, QueryAddress.Feed_Back, requestParams, new RequestCallBack<String>()
10             {
11
12                 @Override
13                 public void onFailure(HttpException arg0, String arg1)
14                 {
15                     // TODO Auto-generated method stub
16                     ToastManagerUtils.show("提交失败", getCurActivity());
17                     dialog.cancel();
18                 }
19
20                 @Override
21                 public void onSuccess(ResponseInfo<String> arg0)
22                 {
23                     OutJsonArrayJson<String> outJsonArrayJson =
24                         gson.fromJson(arg0.result, new TypeToken<OutJsonArrayJson<String>>()
25                         {
26                         }.getType());
27                     if (outJsonArrayJson.getCode() == 200)
28                     {
29                         ToastManagerUtils.show("提交成功", getCurActivity());
30                         AppManager.getAppManager().finishActivity(getCurActivity());
31                     }
32                     dialog.cancel();
33                 }
34
35                 @Override
36                 public void onLoading(long total, long current, boolean isUploading)
37                 {
38                     dialog.show();
39                 }
40             });</span>
41     <span style="font-size:14px;">}catch(Ex e){
42     }
43      }</span>  

这是我另一个项目的"意见反馈"网络请求,可以看出它已经将访问失败和成功封装。但是我一般在onFailure()里面做是否链接网络判断的。 下来再看看BitmapUtils的使用。

这里我简单封装了一下,其实也就是借鉴的网上的;

  1 public class xUtilsImageLoader
  2 {
  3     private BitmapUtils bitmapUtils;
  4
  5     private Context mContext;
  6
  7     private View view;
  8
  9     // otherOrImage为true是设置view背景
 10     private boolean otherOrImage;
 11
 12     @SuppressWarnings("unused")
 13     public xUtilsImageLoader(Context context)
 14     {
 15         // TODO Auto-generated constructor stub
 16         this.mContext = context;
 17
 18         bitmapUtils = new BitmapUtils(mContext);
 19         bitmapUtils.configDefaultLoadingImage(R.drawable.bg_default_truth_words);// 正在加载时显示图片
 20         bitmapUtils.configDefaultLoadFailedImage(R.drawable.bg_default_truth_words);// 加载失败时显示图片
 21         bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565);// Bitmap的位图格式
 22
 23     }
 24
 25     /**
 26      *
 27      * @author sunglasses
 28      * @category 鍥剧墖鍥炶皟鍑芥暟
 29      */
 30     public class CustomBitmapLoadCallBack extends DefaultBitmapLoadCallBack<ImageView>
 31     {
 32
 33         @Override
 34         public void onLoading(ImageView container, String uri, BitmapDisplayConfig config, long total, long current)
 35         {
 36         }
 37
 38         @Override
 39         public void onLoadCompleted(ImageView container, String uri, Bitmap bitmap, BitmapDisplayConfig config,
 40             BitmapLoadFrom from)
 41         {
 42             fadeInDisplayNormal(container, view, bitmap, otherOrImage);
 43         }
 44
 45         @Override
 46         public void onLoadFailed(ImageView container, String uri, Drawable drawable)
 47         {
 48             // TODO Auto-generated method stub
 49
 50         }
 51     }
 52
 53     private static final ColorDrawable TRANSPARENT_DRAWABLE = new ColorDrawable(android.R.color.transparent);
 54
 55     /**
 56      * @author sunglasses
 57      * @category 鍥剧墖鍔犺浇鏁堟灉
 58      * @param imageView
 59      * @param bitmap
 60      */
 61
 62     @SuppressLint("NewApi")
 63     private void fadeInDisplayNormal(ImageView imageView, View view, Bitmap bitmap, boolean otherOrImage)
 64     {
 65         // 设置图片加载动画
 66         final TransitionDrawable transitionDrawable =
 67             new TransitionDrawable(new Drawable[] {TRANSPARENT_DRAWABLE,
 68                 new BitmapDrawable(imageView.getResources(), bitmap)});
 69         if (otherOrImage)
 70         {
 71             view.setBackground(transitionDrawable);
 72         }
 73         else
 74         {
 75             imageView.setImageDrawable(transitionDrawable);
 76         }
 77         transitionDrawable.startTransition(300);
 78
 79     }
 80
 81     public void display(View view, String url, boolean otherOrImage)
 82     {
 83         bitmapUtils.display(new ImageView(mContext), url, new CustomBitmapLoadCallBack());
 84         this.view = view;
 85         this.otherOrImage = otherOrImage;
 86     }
 87
 88     public void clearCache()
 89     {
 90         bitmapUtils.clearMemoryCache();
 91     }
 92
 93     public void clearCache(String url)
 94     {
 95         bitmapUtils.clearCache(url);
 96     }
 97
 98     public void setFailedImage(int id)
 99     {
100         bitmapUtils.configDefaultLoadFailedImage(id);
101     }
102 }  

我发现有时候加载网络图片,有图片出不来的问题。而且它是有图片缓存的。让人真的很不爽。原生的BitmapUtils不能传入自定义View,比如常见 的RoundImageView等。我看同事的是写回调来获得Bitmap对象,我是直接将自定义View传入,通过otherOrImage这个 boolean判断的,有点偷奸耍滑的感觉。其实大家也可以看看Glide这个图片请求框架,很不错的。好了就到这吧,该下班了。其实都是些比较基础的, 这也是受到了工作年龄的限制。希望以后可以给大家带来些有用的。反正努力就是了。

时间: 2024-10-05 23:47:43

Volley与XUtils网络请求使用对比,心得,两者基本使用的相关文章

原 Volley框架之网络请求和图片加载

Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架. Volley的特性 (1).封装了的异步的请求API.Volley 中大多是基于接口的设计,可配置性强.(2).一个优雅和稳健的请求队列,一定程度符合 Http 规范,包括请求头的处理,缓存机制的支持等.(3).自定义的网络图像加载视图(NetworkImageView,ImageLoader等) .(4). 提供简便的图片加载工具. 本案例包含get,post请求和几种网络图片加载的方式,效果如图:   

Windows Phone 网络请求方式对比

目前的Windows Phone平台支持有以下几种实现网络请求的方式:HttpWebRequest.WebClient.WebBrowser.Socket 我个人给他们分个类: 最实用,最麻烦:HttpWebRequest 最简洁:WebClient 最猥琐:WebBrowser 最不常用:Socket 可能用到的一些wp源码案例:http://code.662p.com/list/14_1.html 1.HttpWebRequest: 能实现各种WP上支持的请求类型(目前支持POST/GET)

035 Android Volley框架进行网络请求

1.volley入门介绍 开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行

网络请求框架---Volley

去年的Google I/O大会为android开发者带来了一个网络请求框架,它的名字叫做Volley.Volley诞生的使命就是让Android的网络请求更快,更健壮,而且它的网络通信的实现是基于HttpURLConnection的.前几天我整理了两个网络请求工具类,应付日常工作的开发需求还是没问题的,自己分别在HttpURLConnection和HttpClient的基础上进行进一层的封装,保证了API的足够简洁友好.有兴趣的同学可以回头去翻翻,源码在Github上,搜索AndroidHttp

Volley源码(2):执行网络请求的流程

上一篇(http://blog.csdn.net/szxgg/article/details/51345859)讲述了当我们调用Volley.newRequest()时,Volley内部这个类做了什么,其实Volley这个类就做了一件事情,就是实例化了RequesQueue,这也符合设计模式中的单一职责,其实主要的处理都在其他类中,有三个类最重要,HttpStack/Network/RequestQueue,之后会讲解这些类的关系及作用,那首先还是结合我们使用Volley时的情形来看看源码内部执

Android应用中网络请求库Volley的介绍

Volley 是一个HTTP的库,使用它能让Android应用网络传输的操作更加轻松,快捷.Volley的代码是托管在Android 源代码树下的一个工程,编译出来后是一个volley.jar文件.以下是Volley的特点 自动调度在代码中提交的网络请求(http) 多个网络请求的并发执行 对用户透明的磁盘或内存的缓存机制(本质是Http缓存机制) 能够支持网络请求的优先级 能在代码中,必要时轻松的取消网络请求(如activity销毁时),可以取消指定tag的网络请求,或按某种机制分类的网络请求

android网络请求库volley方法详解

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest(“请求方法”,“请求的网络地址”,“成功的网络回调”,“失败的网络回调”): Ima

Volley——网络请求

Volley作为当年Google在2013年的Google I/O上的重点,是一个相当给力的框架.它从设计模式上来说,非常具有扩展性,也比较轻巧.关于Volley的使用,网上介绍的很多了,不再赘述.现在,我将记录我阅读Volley源码的过程,来学习Volley的设计思想和其中的一些小技巧. 值的一提的是,新版的gradle已经支持: compile 'com.android.volley:volley:1.0.0' 这样导入Volley了. 从最简单的例子看起: RequestQueue que

【Android】Volley做网络请求的几种用法

前言: 最近在将自己写的烂代码重构,以前使用的网络请求全是基于apache的HttpClient,简单使用还好,使用多了发现重复代码太多,而且每次使用都很繁琐,因此在网上找了半天网络请求的相关类库,最后还是确定使用Volley,于是现在记个使用笔记: Volley几个主要功能: 1. 普通String请求: 既然使用了网络请求,那么网络权限是必不可少的,在AndroidManifest.xml中添加: <uses-permission android:name="android.permi