zoukankan      html  css  js  c++  java
  • 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这个图片请求框架,很不错的。好了就到这吧,该下班了。其实都是些比较基础的, 这也是受到了工作年龄的限制。希望以后可以给大家带来些有用的。反正努力就是了。

  • 相关阅读:
    信息与网络安全需要大数据安全分析
    启明星辰:安全管理平台(SOC)
    苦练SOC“基本功”启明星辰九年磨一剑
    SpringMVC项目中web.xml中的节点载入顺序问题
    HDU2550 百步穿杨
    Android:Activity+Fragment及它们之间的数据交换(一)
    JAVA实现EXCEL公式专题(四)——字符串函数
    nginx phase handler的原理和选择
    TRIZ系列-创新原理-20-有效作用的连续性原理
    CSS实现鼠标放图片上显示白色边框+文字描写叙述
  • 原文地址:https://www.cnblogs.com/huolongluo/p/5808295.html
Copyright © 2011-2022 走看看