Volley的使用(一) get请求和获取网络图片

什么是Volley以及为什么使用Volley

在我们android开发过程中不可避免的要进行网络访问,android为我们提供了两种方式来访问网络:HttpURLConnection和HttpClient
而使用这两种类来访问网络的时候仍然需要大量的代码来实现,而且对于不熟练的人来说很容易出错。
并且由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以在Android 5.1中,HttpClient类已被废弃。
谷歌为了使网络访问更加简易在2013年推出了Volley。

volley的优点和不足:

1、默认Android2.3及以上HttpURLConnection(因为2.3以下这个类有很多Bug),2.3以下使用HttpClient;
2、缓存机制优秀;
3、请求队列可以针对优先级排序;
4、提供多种取消机制;
5、图片加载异常简单(这项比较重要,不需要考虑内存优化和图片加载时的内存溢出);
6、使用非常简单;
7、官方提供,必须是精品啊。

不足:Volley在轻量的网络访问中表现优秀,但是对于流媒体和大数据文件的传输支持不够。

基于以上种种原因我们使用Volley。

如何使用Volley?

首先我们要下载Volley。
谷歌gitbut地址:
https://android.googlesource.com/platform/frameworks/volley
也可以从我的csdn资源上下载:
http://download.csdn.net/download/baidu_31093133/9511419
将下载的jar包复制到android工程的libs目录下。

首先说一下volley的requestQueue,使用volley的第一步就是建立一个这样的请求队列用于存放自己的网络请求。
通常我们会在application里建立一个全局的请求队列。
如下:

public class MyApplication extends Application {

    //建立一个请求队列
    public static RequestQueue queues;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        //实例化一个请求队列
        queues = Volley.newRequestQueue(getApplicationContext());
    }   
    //建立方法返回请求队列
    public static RequestQueue getHttpQueues() {
        return queues;
    }   
}

使用StringRequest:

//定义一个url
String url = "  http://op.juhe.cn/onebox/weather/query?cityname=%E6%B8%A9%E5%B7%9E&key=5fc2b142029b1b0d371d5449a8b8927d";
//定义一个StringRequest
StringRequest request = new StringRequest(Method.GET, url, new
         Listener<String>() {// 添加请求成功监听

         @Override
         public void onResponse(String response) {
         Toast.makeText(MainActivity.this, "网络访问成功"+,
         Toast.LENGTH_LONG).show();
         }
         }, new Response.ErrorListener() {// 添加请求失败监听

         @Override
         public void onErrorResponse(VolleyError error) {
         Toast.makeText(MainActivity.this, error.toString(),
         Toast.LENGTH_LONG).show();
         }
         });
         // 设置请求的tag标签,便于在请求队列中寻找该请求
         request.setTag("lhdGet");
         // 添加到全局的请求队列
         MyApplication.getHttpQueues().add(request);
使用JsonObjectRequest:
//同样实例化一个JsonObjectRequest
        JsonObjectRequest request2 = new JsonObjectRequest(Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
        Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
            }
        });
        // 设置请求的tag标签,便于在请求队列中寻找该请求
        request2.setTag("lhdGet2");
        // 添加到全局的请求队列
        MyApplication.getHttpQueues().add(request2);
StringRequest和JsonObjectRequest的区别:
当我们不清楚网络访问的返回值的时候就使用StringRequest,如果知道返回值是一个Json格式的文件就使用JsonObjectRequest

Volley获取网络图片:

1、ImageRequest

1、创建一个RequestQueue
2、创建一个ImageRequest
3、将ImageRequest添加到RequestQueue
事实上StringRequest,JsonRequest和ImageRequest都是继承自Request的所以它们的用户也都类似。

示例:

ImageRequest imageRequest = new ImageRequest(  
        http://img1.imgtn.bdimg.com/it/u=2680373034,1460593141&fm=21&gp=0.jpg",  
        new Response.Listener<Bitmap>() {  
            @Override  
            //请求成功回调
            public void onResponse(Bitmap response) {  
            //加载网络图片
                imageView.setImageBitmap(response);  
            } 
   //0,0表示最大宽和高 RGB_565是颜色模式
        }, 0, 0, Config.RGB_565, new Response.ErrorListener() {  
            @Override  
             //请求失败回调
            public void onErrorResponse(VolleyError error) {  
   //设置访问失败加载的图片             imageView.setImageResource(R.drawable.default_image);  
            }  
        });  

最后将这ImageRequest对象添加到RequestQueue里。

2、ImageLoader

ImageLoader的内部是使用ImageRequest来实现的,但它ImageLoader更高效,因为它不仅可以缓存图片,还可以防止重复发送同样的请求。

使用步骤:

1、创建一个RequestQueue
2、创建一个ImageLoader
3、自定义一个类继承ImageCache
4、创建一个ImageListener
5、加载网络图片

1、创建RequestQueue同上面
2、创建ImageLoader
示例:

    ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCash());

其中自定义BitmapCash()类是继承ImageCache的实现类
3、自定义BitmapCash类继承ImageCache
BitmapCash:

public class BitmapCash implements ImageCache{

    public LruCache<String, Bitmap>cache;
    //将缓存图片的大小设置为10M
    public int max = 10*1024*1024;
    public BitmapCash () {
        cache = new LruCache<String,Bitmap>(max){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes()*value.getHeight();
            }
        };

    }
    //这里会获取到图片
    @Override
    public Bitmap getBitmap(String url) {
        return cache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        // TODO Auto-generated method stub
        cache.put(url, bitmap);
    }
}

4、//创建ImageListener
ImageListener listener =
//顶一个参数是加载图片的imageView控件
ImageLoader.getImageListener(imageView,
//第二个参数是默认图片 第三个是访问失败时加载图片
R.drawable.ic_launcher, R.drawable.ic_launcher);
5、获取图片。第一个参数是图片地址,第二个是ImageListener 然后使用loader.get(url, listener);来获取网络图片。

如果想指定图片的宽和高
也可以使用loader.get(url, listener, 200, 200);

有了以上的基础,相信大家对Volley网络访问有一定的了解了吧,接下来描述会简洁一点。

3、NetworkImageView

这是volley提供的一个自定义控件,具备imageview控件的所有功能,并自带加载网络图片的功能。

NetworkImageView使用步骤:
  1. 创建一个RequestQueue
  2. 创建一个ImageLoader
  3. 在布局文件中添加一个NetworkImageView控件
  4. 代码中实例化该控件的
  5. 设置要加载的图片地址

1、2步同上
3、步骤直接在xml布局文件使用该控件
4、使用findviewById()实例化控件
5、获取图片:

String url = "http://img1.imgtn.bdimg.com/it/u=2680373034,1460593141&fm=21&gp=0.jpg";
//设置默认图片
imageView.setDefaultImageResId(R.drawable.ic_launcher);
//设置访问失败的图片
imageView.setErrorImageResId(R.drawable.ic_launcher);
//开始获取。url为图片的地址。loader为
imageView.setImageUrl(url, loader);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值