博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络通信框架Volley使用详细说明
阅读量:6844 次
发布时间:2019-06-26

本文共 5652 字,大约阅读时间需要 18 分钟。

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象
  1. private RequestQueue mRequestQueue;

     

 
在onCreate初始化mRequestQueue
 
  1. mRequestQueue =  Volley.newRequestQueue(this);

     

1.2 声明并使用Request

 
  1. JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener
    () { @Override public void onResponse(JSONObject response) { Log.i(TAG,response.toString()); parseJSON(response); va.notifyDataSetChanged(); pd.dismiss(); } },new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.i(TAG,error.getMessage()); } }); mRequestQueue.add(jr);

     

Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON对象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,这样可以自己处理数据,更加灵活。

另外可以继承Request<T>自定义Request。

 

1.3 取消Request

      Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。
1)可以针对某些个request做取消操作:
 
  1. @Override  public void onStop() {      for (Request 
    req : mRequestQueue) { req.cancel(); } }

     

 
2)取消这个队列里的所有请求:
 
  1. @Override  protected void onStop() {      // TODO Auto-generated method stub      super.onStop();      mRequestQueue.cancelAll(this);  }

     

3)可以根据RequestFilter或者Tag来终止某些请求
@Override  rotected void onStop() {    // TODO Auto-generated method stub    super.onStop();      mRequestQueue.cancelAll( new RequestFilter() {    }  );    or    mRequestQueue.cancelAll(new Object());

 

 
Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法 。
 
 
 

2、图片加载

2.1使用ImageRequest下载图片

    Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。
 
  1. singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);          ImageRequest imgRequest=new ImageRequest(url, new Response.Listener
    () { @Override public void onResponse(Bitmap arg0) { // TODO Auto-generated method stub singleImg.setImageBitmap(arg0); } }, 300, 200, Config.ARGB_8888, new ErrorListener(){ @Override public void onErrorResponse(VolleyError arg0) { // TODO Auto-generated method stub } }); mRequestQueue.add(imgRequest);

     

2.2使用ImageLoader

    ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

    Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

    ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

 
  1. RequestQueue mRequestQueue = Volley.newRequestQueue(this);          final LruCache
    mImageCache = new LruCache
    (20); ImageCache imageCache = new ImageCache() { @Override public void putBitmap(String key, Bitmap value) { mImageCache.put(key, value); } @Override public Bitmap getBitmap(String key) { return mImageCache.get(key); } }; ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache); // imageView是一个ImageView实例 // ImageLoader.getImageListener的第二个参数是默认的图片resource id // 第三个参数是请求失败时候的资源id,可以指定为0 ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete); mImageLoader.get(url, listener);

     

2.3 使用NetworkImageView

 

 
  1. public class NetworkImageView extends ImageView

     

继承自ImageView,添加了一个

  1. public void setImageUrl(String url, ImageLoader imageLoader) {}

     

方法,参数包含一个Url地址和一个ImageLoader对象

核心方法:

 
  1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}

     

内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存

内部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。
覆写方法:

@Override  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {    super.onLayout(changed, left, top, right, bottom);    //onLayout时重新请求    loadImageIfNecessary(true);  }  @Override  protected void onDetachedFromWindow() {    //销毁View的时候Release操作    if (mImageContainer != null) {      // If the view was bound to an image request, cancel it and clear      // out the image from the view.      mImageContainer.cancelRequest();      setImageBitmap(null);      // also clear out the container so we can reload the image if necessary.      mImageContainer = null;    }    super.onDetachedFromWindow();  }  //drawable状态改变重绘  @Override  protected void drawableStateChanged() {    uper.drawableStateChanged();    invalidate();  }

 

    总结:网络请求下载图片显示,可以使用此控件,比传统的ImageView多了网络处理,也添加了2个方法,设置开始下载的默认图和下载出错后显示图。

/** * Sets the default image resource ID to be used for this view until the attempt to load it * completes. */  public void setDefaultImageResId(int defaultImage) {    mDefaultImageId = defaultImage;  }  /** * Sets the error image resource ID to be used for this view in the event that the image * requested fails to load. */  public void setErrorImageResId(int errorImage) {    mErrorImageId = errorImage;  }

 

转载于:https://www.cnblogs.com/fengchuxiaodai/p/5348142.html

你可能感兴趣的文章
PHP开发面试常问问题合集
查看>>
【Android】RxJava的使用(一)基本用法
查看>>
PHP面试常考内容之面向对象(2)
查看>>
CentOS7网卡配置
查看>>
iterator_traits获取迭代器类型
查看>>
小程序页面之间的通讯利器 - nsevent
查看>>
Go语言很好很强大,但我有几个问题想吐槽
查看>>
Beaker:一个基于Electron的点对点Web浏览器
查看>>
【译】 WebP 支持:超出你想象
查看>>
NodeJS中被忽略的内存
查看>>
Ubuntu编译jdk7记录
查看>>
[openCV2.1]常用功能
查看>>
Vue 组件实例属性的使用
查看>>
Linux基础命令---cpio
查看>>
Vue 组件库 HeyUI@1.17.0 发布,新增 Skeleton 组件
查看>>
MySQL基础入门-第一课 新建数据库(linux版本)
查看>>
康沣生物获比邻星创投等机构数千万人民币投资
查看>>
如何编写linux下nand flash驱动-4
查看>>
poj-1146 ID codes
查看>>
2018-08-31
查看>>