首页 > 其他分享 ># Android网络请求(4) 网络请求框架Volley

# Android网络请求(4) 网络请求框架Volley

时间:2022-11-23 15:57:08浏览次数:55  
标签:String requestQueue 网络 new Volley public 请求

Android网络请求(4) 网络请求框架Volley

Volley是Google在2013年5月15日到17日在旧金山Moscone中心举办网络开发者年会中推出的Android异步网络加载框架和图片加载框架,它特别适合数据体量小且通讯频繁的网络操作场景,而Android开发中大多数场景都是这样的,但是如果让它去进行文件上传下载之类的大数据量网络操作,那么他的表现将非常差。

那么让我们走进Volley,来熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一个图片加载框架NetworkImageView,我们也来一起了解一下吧。

导入依赖

Volley的历史不短,但是它的修改却很少,现在最高的版本也才1.2.1。我们使用的是1.1.1版本,现在build.gradle(app)中的dependencies中导入依赖

implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'

网络请求

Get请求

//      请求地址
        String src = "https://www.baidu.com";
//      创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      创建请求
        StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {//成功时返回的response数据
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void one rrorResponse(VolleyError error) {//失败时返回的error信息
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      将请求添加至队列中,否则不会发起请求
        requestQueue.add(request);

直接在MainActivity中进行网络请求,这与我们之前的方式不太一样,这是因为Volley请求代码比OkHtpp还要简短,监听都可以new+空格+回车 自动弹出,我们只需要管理返回的数据即可,而且创建的请求队列并不只能使用一次,这是一个队列,可以加入多个请求,所以,我们只需要创建请求并且导入到这个队列中即可。

Post请求

post请求比get请求多一些参数,首先就是在创建请求时要去指定请求为post,因为默认请求时get,其次需要重写一个方法用于传递post请求所携带的参数,如果不这么做的话,就会报错。

//      请求地址
        String src = "https://xxx.xxx.com";
//      创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      创建请求,添加请求类型
        StringRequest request = new StringRequest(Request.Method.POST   ,src, new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {//成功时返回的response数据
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void one rrorResponse(VolleyError error) {//失败时返回的error信息
                String message = error.getMessage();
                System.out.println(message);
            }
        }){
//            post请求一定要传入参数否则报错
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> map = new HashMap<>();
                map.put("username","123456");
                map.put("password","123456");
                return map;
            }
        };
//      将请求添加至队列中,否则不会发起请求
        requestQueue.add(request);

Put请求

Put请求就不说了,只需要修改请求方法即可

Delete请求

delete请求如果需要携带参数,可以在post请求的基础上修改请求方法,如果不携带参数可以在get请求的基础上添加请求方法。

Json数据请求

我们注意到了,我们返回的都是String类型的值,我们日常开发中返回的值大多数时json格式的,那么我们怎么样去请求json数据呢。Volley提供了JsonObjectRequest和JsonArrayRequest这两个类可用于返回json数据。它的使用方法和StringRequest是一样的,只需要修改一些参数即可。另外他不在需要通过重写方法来传递参数,可以直接将你需要的参数转换成json格式,在实例化JsonObjectRequest时传入

Get请求

//      请求地址
        String src = "https://www.baidu.com";
//      创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      创建请求,添加请求类型
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {//成功时返回的response数据
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void one rrorResponse(VolleyError error) {//失败时返回的error信息
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      将请求添加至队列中,否则不会发起请求
        requestQueue.add(request);

Post

//      请求地址
        String src = "https://www.baidu.com";
//      创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      创建参数
        JSONObject data = new JSONObject();
        try {
            data.put("username","123");
            data.put("password","123");
        } catch (JSONException e) {
            e.printStackTrace();
        }
//      创建请求,添加请求类型

//      顺序是 请求方法 请求地址 请求携带的数据 监听器
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {//成功时返回的response数据
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void one rrorResponse(VolleyError error) {//失败时返回的error信息
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      将请求添加至队列中,否则不会发起请求
        requestQueue.add(request);

Put

在post基础上修改请求方法即可

delete

判断是否携带参数并且post或get中修改即可

网络图片加载框架

1、通过ImageRequest请求网络图片

这种方法是通过ImageRequest来请求一张图片转换为Bitmap格式,在返回的Bitmap中对ImageView进行设置图片,较为简单。

        img = (ImageView) findViewById(R.id.img);
//        创建链接
        String url = "图片链接";
//      创建队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//        创建图片请求
        ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                img.setImageBitmap(response);
            }
        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void one rrorResponse(VolleyError error) {

            }
        });
//        添加进队列
        requestQueue.add(imageRequest);

2、通过Imageloader加载图片

这种方法对比起上一种来说要更加复杂一些,我们需要先新建一个类实现ImageLoader.ImageCache接口

public class BitmapCache implements ImageLoader.ImageCache{
        private LruCache<String, Bitmap> mCache;

        public BitmapCache() {
            //设置图片最大值
            int maxSize = 10*1024;
            mCache = new LruCache<String, Bitmap>(maxSize){
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    return value.getRowBytes()*value.getHeight();
                }
            };
        }

        @Override
        public Bitmap getBitmap(String url) {
            return mCache.get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mCache.put(url,bitmap);
        }
    }

然后再去MainActivity中去创建ImageLoader,它不需要我们去设置图片,只需要将图片作为一个参数传递进去,它会帮我们自动加载进ImageView中。

        img = (ImageView) findViewById(R.id.img);
//        创建链接
        String url = "图片链接";
//      创建队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//        创建图片请求
        ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
//        设置图片加载监听,设置默认图片和加载错误图片
        ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
//        发起请求
        imageLoader.get(url,imageListener);

3、通过NetworkImageView加载图片

除了使用ImageView加载图片,Volley还提供了一个组件就是NetworkImageView,我们在布局文件上使用它。

   <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.android.volley.toolbox.NetworkImageView>

它同样需要前面的BitmapCache类,因为他也需要ImageLoder。

        img = (NetworkImageView) findViewById(R.id.img);
//        创建链接
        String url = "图片地址";
//      创建队列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//      创建一个ImageLoader
        ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());

        // 默认图片和异常图片设置
        img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
        img.setErrorImageResId(R.drawable.ic_home_black_24dp);
//        加载图片
        img.setImageUrl(url,imageLoader);

总结

不管你使用的是Volley框架是单纯的请求数据还是加载图片都要记住,它不适合体量较大的网络请求。

以上三种加载网络图片的方式最终都能得到成果图

标签:String,requestQueue,网络,new,Volley,public,请求
From: https://www.cnblogs.com/nhgtx/p/16918545.html

相关文章

  • 网络爬虫的常用技术
    Python中实现HTTP网络请求常见的3种方式为:urlib,urllib3和requests。下面将一一进行介绍1.urllib模块urllib是Python自带模块,该模块中提供了一个urlopen()方法,通过该方法指定U......
  • 网络爬虫入门
    网络爬虫,又称作网络蜘蛛、网络机器人,在某社区中经常被称为网页追逐者。可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息,通过Python可以很轻松地编写爬虫程序或......
  • 卷积神经网络(CNN)(中)
    4.GoogleNet GoogleNet(也可称作Inception)是在2014年由GoogleDeepMind公式的研究员提出的一种全新的深度学习结构,并取得了ILSVRC2014比赛项目的第一名。GooleNet共有22层,并......
  • 网络原理练习题(含答案)
    一、填空题(每空1分,共10分) 1. 在采用电信号表达数据的系统中,数据有数字数据和__模拟数据____两种。2.国际标准化组织ISO提出的不基于特定机型、操作系统或公司的网络体系结构......
  • jmeter中发出请求后,response data中的中文乱码了
    场景/报错:在jmeter中发出请求后,接收到的responsedata中的中文乱码了,显示如图:原因:编码方式有问题,这种情况应该是用ISO-8859-1读取了UTF-8解决方法:修改jmeter的配置文件,三步......
  • 全球名校AI课程库(41)| WUSTL · 深度神经网络应用全案例实操系列课程『Applications of
    <divalign=center><imgalt="T81-558;ApplicationsofDeepNeuralNetworks;深度神经网络应用案例实操"src="http://tva1.sinaimg.cn/large/0060yMmAly1h6wx48cg8hj31k......
  • 网络层IP地址
    1.概述IP地址的组成为什么要使用逻辑地址(IP地址)来标识网络设备而不采用网卡设备本身就有的唯一标识物理地址(MAC地址)呢?IP地址的使用到底是基于什么考虑呢?因为使......
  • 网络
    一、专线专线是通信公司给的专有网络。如电信给公司加了防火墙,从防火墙出来的分支到具体的云ip,还是实体机,额外再给你几个固定ip。这个固定的ip可以作公司自己买的实体服务......
  • Java 网络编程(七)URL
    URL:https://www.baidu.com/协议://ip地址:端口/项目名/资源 统一资源定位符:定位资源的,定位互联网上的某一个资源DNS域名解析www.baidu.com publicclassURLDem......
  • Java 网络编程(六)UDP
    UDP发短信:不用连接,需要知道对方的地址客户端://不需要连接服务器publicclassUdpClientDemo01{publicstaticvoidmain(String[]args)throwsException{......