Volley 框架 网络请求工具

Volley的简介和特点:
特点:
 并发性,效率高,性能好。
Volley  :并发,齐射
 2013年开发大会上提出的网络请求工具,起源于框架afinal的框架。
 1.github
 2.csdn 
网络请求的好处:
 1.网络请求效率较高,而且写法简单,开发效率会得到很大提升。
 2.可以处理get,post等网络请求同时可以高效率的加载网络图片。
 3.可以不同的网络请求进行排序,根据优先级进行处理。
 4.网络请求缓存处理。
 5.多级别的取消请求。

 6.和activity的生命周期进行联动。

关于volley的底层常用类的分析
Volley:Volley 对外暴露的 API,通过 newRequestQueue(…) 函数新建并启动一个请求队列RequestQueue。
Request:表示一个请求的抽象类。StringRequest、JsonRequest、ImageRequest 都是它的子类,表示某种类型的请求。
RequestQueue:表示请求队列,里面包含一个CacheDispatcher(用于处理走缓存请求的调度线程)、
                             NetworkDispatcher数组(用于处理走网络请求的调度线程),一个ResponseDelivery(返回结果分发接口),
通过 start() 函数启动时会启动CacheDispatcher和NetworkDispatchers。
CacheDispatcher:一个线程,用于调度处理走缓存的请求。启动后会不断从缓存请求队列中取请求处理,队列为空则等待,
                           请求处理结束则将结果传递给ResponseDelivery去执行后续处理。当结果未缓存过、缓存失效或缓存需要刷新的情况下,
   该请求都需要重新进入NetworkDispatcher去调度处理。
NetworkDispatcher:一个线程,用于调度处理走网络的请求。启动后会不断从网络请求队列中取请求处理,队列为空则等待,
                            请求处理结束则将结果传递给ResponseDelivery去执行后续处理,并判断结果是否要进行缓存。
ResponseDelivery:返回结果分发接口,目前只有基于ExecutorDelivery的在入参 handler 对应线程内进行分发。
HttpStack:处理 Http 请求,返回请求结果。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStack。
Network:调用HttpStack处理请求,并将结果转换为可被ResponseDelivery处理的NetworkResponse。
Cache:缓存请求结果,Volley 默认使用的是基于 sdcard 的DiskBasedCache。NetworkDispatcher得到请求结果后判断是否需要存储在 
                            Cache,CacheDispatcher会从 Cache 中取缓存结果。

实例一:

post方式的使用

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class StringPostActivity extends AppCompatActivity {  
  2.   
  3.     private String url = "http://218.244.149.129:9010/api/companylist.php";  
  4.     //?industryid=98  
  5.     private TextView mTv;  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_string_request);  
  11.         mTv = (TextView) findViewById(R.id.tv1);  
  12.         volleyPost(url);  
  13.     }  
  14.   
  15.     public void volleyPost(String url){  
  16.         StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {  
  17.             @Override  
  18.             public void onResponse(String s) {  
  19.                 Log.i("tag","sss-----"+s);  
  20.                 mTv.setText(s.substring(s.indexOf("{")));  
  21.             }  
  22.         }, new Response.ErrorListener() {  
  23.             @Override  
  24.             public void onErrorResponse(VolleyError volleyError) {  
  25.   
  26.             }  
  27.         }){  
  28.             //post请求需要重写的方法,map当中包含要写入到服务器当中的数据,key就是代表等号左边。  
  29.             @Override  
  30.             protected Map<String, String> getParams() throws AuthFailureError {  
  31.                 Map<String,String>map = new HashMap<>();  
  32.                 map.put("industryid","98");  
  33.                 return map;  
  34.             }  
  35.         };  
  36.   
  37.         MyApplication.getHttpQueue().add(request);  
  38.     }  
  39. }  

实例二:

ImageRequest的使用

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class ImageRequestActivity extends AppCompatActivity {  
  2.   
  3.     private String url = "https://img-my.csdn.net/uploads/201407/26/1406383213_3557.jpg";  
  4.     private ImageView mIv;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_image_request);  
  10.         mIv = (ImageView) findViewById(R.id.iv);  
  11.   
  12.         volleyImage(url);  
  13.     }  
  14.     /** 
  15.      * String url,  图片的地址 
  16.      * Listener<Bitmap> listener  获取图片成功时回调的接口 
  17.      * int maxWidth,    图片的最大的宽度 
  18.      * int maxHeight,    图片的最大的高度 
  19.      * Config decodeConfig,    图片加载的质量 
  20.      *     可选四种: 
  21.      *       ARGB_8888        8+8+8+8 =32位          32/8=4字节      ==1个像素点上的字节数 
  22.      *       ARGB_4444        16位                   2字节 
  23.      *       RGB_565          16位                   2字节   :一般选择,因为图片压缩较小,且相对较为清晰 
  24.      *       ALPHA_8          不实用 
  25.      * 
  26.      *       480*800 = 384000 *4/1024/1024 
  27.      * ErrorListener errorListener    :获取图片失败时回调的接口 
  28.      * */  
  29.     public void volleyImage(String url){  
  30.         ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {  
  31.             @Override  
  32.             public void onResponse(Bitmap bitmap) {  
  33.                 mIv.setImageBitmap(bitmap);  
  34.             }  
  35.         },200,200,Bitmap.Config.RGB_565,new Response.ErrorListener(){  
  36.             @Override  
  37.             public void onErrorResponse(VolleyError volleyError) {  
  38.                 mIv.setImageResource(R.mipmap.ic_launcher);  
  39.             }  
  40.         });  
  41.   
  42.         MyApplication.getHttpQueue().add(request);  
  43.     }  
  44. }  
实例三:

NetWorkImageView的使用

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class NetworkImageActivity extends AppCompatActivity {  
  2.     private NetworkImageView netIv;  
  3.     private String url = "https://img-my.csdn.net/uploads/201407/26/1406383172_4577.jpg";  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_network_img);  
  9.         netIv = (NetworkImageView) findViewById(R.id.netIv);  
  10.         RequestQueue mQueue = MyApplication.getHttpQueue();  
  11.         //图片异步加载器  
  12.         ImageLoader loader = new ImageLoader(mQueue,new BitmapCache());  
  13.         //设置默认加载的图片  
  14.         netIv.setDefaultImageResId(R.mipmap.ic_launcher);  
  15.         //设置网络获取失败时加载的图片  
  16.         netIv.setErrorImageResId(R.mipmap.ic_launcher);  
  17.         netIv.setImageUrl(url,loader);   //设置图片加载的地址,和加载器  
  18.     }  
  19. }  

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <com.android.volley.toolbox.NetworkImageView  
  2.        android:id="@+id/netIv"  
  3.        android:layout_width="200dp"  
  4.        android:layout_height="200dp"  
  5.        android:layout_gravity="center"  
  6.        android:src="@mipmap/ic_launcher">  
  7.   
  8.    </com.android.volley.toolbox.NetworkImageView>  

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class BitmapCache implements ImageLoader.ImageCache{  
  2.     //定义缓存对象  
  3.     private LruCache<String,Bitmap>cache;  
  4.     //定义最大的存储空间  
  5.     private int maxSize = 8*1024*1024;  
  6.     public BitmapCache(){  
  7.         cache = new LruCache<String, Bitmap>(maxSize){  
  8.             @Override  
  9.             protected int sizeOf(String key, Bitmap value) {  
  10.                 //计算需要存储的bitmap的对象的字节数  
  11.                 return value.getRowBytes()*value.getHeight();  
  12.             }  
  13.         };  
  14.     }  
  15.     @Override  
  16.     public Bitmap getBitmap(String url) {  
  17.         return cache.get(url);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void putBitmap(String s, Bitmap bitmap) {  
  22.         cache.put(s,bitmap);  
  23.     }  
  24. }  

实例四:

ImageLoaderd的使用

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class ImageViewActivity extends AppCompatActivity {  
  2.   
  3.     private ImageView iv;  
  4.     private String url = ImageUrls.imageurls[2];  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_image_view);  
  9.         iv = (ImageView) findViewById(R.id.iv);  
  10.         RequestQueue queue = MyApplication.getHttpQueue();  
  11.         ImageLoader loader = new ImageLoader(queue,new BitmapCache());  
  12.   
  13.         ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);  
  14.         //完成了图片的缓存  
  15.         loader.get(url,listener);  
  16.     }  

  1. }  

Volley底层框架分析简单版:
说道volley框架,我们要先从三个类来说,Volley,Request,RequestQueue。Volley对外暴露的API,
主要通过 newRequestQueue(…)函数,得到了 HttpStack,然后通过它构造一个代表网络(Network)的具体实现BasicNetwork。
接着构造一个代表缓存(Cache)的基于 Disk 的具体实现DiskBasedCache。
最后将网络(Network)对象和缓存(Cache)对象传入构建一个 RequestQueue,启动这个 RequestQueue,并返回。

Request类代表一个网络请求的抽象类。我们通过构建一个Request类的非抽象子类(StringRequest、JsonRequest、ImageRequest或自定义)
对象,并将其加入到·RequestQueue·中来完成一次网络请求操作。Request 类中包含了请求 url,请求请求方式,请求 Header,请求 Body,请求的优先级等信息。

RequestQueue是Volley框架的核心类,将请求Request加入到一个运行的RequestQueue中,来完成请求操作。
加入请求到队列当中,经过了判断是否允许缓存到是否正在被处理,如果存在,则将等待队列移除,并将等待队列所有的请求添加到缓存请求队列中,
让缓存请求处理线程CacheDispatcher自动处理。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值