Android Volley开源框架的使用

本文介绍了Google推出的Android网络通信框架Volley,重点讲解了如何使用Volley进行网络图片加载,包括已被弃用的ImageRequest,推荐的ImageLoader以及NetworkImageView的使用方法,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Android Volley 开源框架的使用

2013年Google I/O大会上推出了一个新的网络通信框架——Volley。它既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。

除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

1、Volley ImageRequest 加载网络图片示例
** 此方法已经弃用,随便了解下

(1)在AS中添加依赖库 implementation 'com.mcxiaoke.volley:library:1.0.19'
(2)XML 布局文件只有一个Button 、一个ImageView 较简单此处省略
(3)MainActivity.java文件如下

public class MainActivity extends Activity {

    private Button imgRequest;
    private ImageView imageView;
    private Volley volley;
    private RequestQueue requestQueue;
    private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestQueue = volley.newRequestQueue(MainActivity.this);    //初始化请求队列

        imageView = findViewById(R.id.image);
        imgRequest = findViewById(R.id.btn1);
        imgRequest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 //ImageRequest构造函数需要6个参数
                 ImageRequest imageRequest = new ImageRequest(imgUrl, new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        imageView.setImageBitmap(bitmap);
                    }
                }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                });
                 requestQueue.add(imageRequest);     //将请求添加到请求队列里面
            }
        });
    }
}

在这里插入图片描述

2、Volley ImageLoader 加载网络图片示例
ImageLoader 加载图片并实现缓存,界面很简单,一个Button + ImageView。添加依赖库同上,直接上代码。
(1)布局XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="imageLoader" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/image"/>

</LinearLayout>

(2)MainActivity.java代码

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity" ;
    private Button btnImg;
    private ImageView imageView;
    private Volley volley;
    private RequestQueue requestQueue;
    private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";
    private MyImageCache myImageCache;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestQueue = volley.newRequestQueue(MainActivity.this);
        myImageCache = new MyImageCache();

        imageView = findViewById(R.id.image);
        btnImg = findViewById(R.id.btn1);

        btnImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImageLoader imageLoader = new ImageLoader(requestQueue, myImageCache);
                ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView,
                        R.drawable.moren,R.drawable.cuowu);     //图片控件、默认图片、错误图片
                imageLoader.get(imgUrl,imageListener);
            }
        });
    }
}   

 class MyImageCache implements ImageLoader.ImageCache {   //自定义缓存类

    private static final String TAG = "MyImageCache";
    private LruCache<String,Bitmap> lruCache;     //lru 最近最少使用算法

    public MyImageCache(){
        int maxSize = 10 * 1024 * 1024;  //最大为10M
        lruCache = new LruCache<String, Bitmap>(maxSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight();   //得到图片的size
            }
        };
    }

    @Override
    public Bitmap getBitmap(String url) {
        Bitmap bitmap = lruCache.get(url);
        if (bitmap == null){
            Log.e(TAG,"getBitmap failed bitmap == null");
        }else {
            Log.e(TAG,"getBitmap success bitmap != null");
        }
        return bitmap;   //从缓存中拿到图片
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        if (bitmap == null){
            Log.e(TAG,"putBitmap failed bitmap == null");
        }else {
            Log.e(TAG,"putBitmap success bitmap != null");
        }
         lruCache.put(url,bitmap);     //如果缓存中没有,从网络拿
    }
}

首次运行肯定拿不到缓存图片,因此会打印 getBitmap failed bitmap == null , 接着从网络拿图片
putBitmap success bitmap != null ,后面再点击button的时候都会从缓存拿图片,将打印
getBitmap success bitmap != null 。

08-27 04:07:16.638 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap failed bitmap == null
08-27 04:07:16.944 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: putBitmap success bitmap != null
08-27 04:07:42.281 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap success bitmap != null
08-27 04:07:44.233 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap success bitmap != null

3、Volley NetworkImageView 加载网络图片示例
在上面两个步骤的基础上,学习NetworkImageView加载网络图片,较简单。
(1)MainActivity.java

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity" ;
    private Button netImg;
    private NetworkImageView imageView;    //定义NetworkImageView 组件
    private Volley volley;
    private RequestQueue requestQueue;
    private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";
    private MyImageCache myImageCache;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestQueue = volley.newRequestQueue(MainActivity.this);
        myImageCache = new MyImageCache();     //MyImageCache 类同上

        imageView = findViewById(R.id.netImage);
        netImg = findViewById(R.id.btn1);

        netImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImageLoader imageLoader = new ImageLoader(requestQueue, myImageCache);
                imageView.setDefaultImageResId(R.drawable.moren);
                imageView.setErrorImageResId(R.drawable.cuowu);
                imageView.setImageUrl(imgUrl,imageLoader);
            }
        });
    }
}

(2)布局XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="netImagview" />

    <com.android.volley.toolbox.NetworkImageView      // NetworkImageView控件
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/netImage"/>

</LinearLayout>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值