AI智能
改变未来

Android 网络请求框架(一) Volley

今天给大家带来的是Android网络通信框架第一篇,Volley请求

  • Volley介绍
  • 必做操作
  • StringRequest文本请求
  • JsonObjectRequest获取JSON字符串GET和POST请求
  • GET请求
  • POST请求
  • ImageRequest设置图片
  • ImageLolder
  • Volley介绍

    Volley是在2013年Google I/O大会上推出了一个新的网络通信框架,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

    必做操作

    添加依赖

    implementation ‘com.android.volley:volley:1.1.1’

    网络请求都必须添加INTERNET权限,想必大家都非常清楚了.

    <uses-permission android:name=“android.permission.INTERNET”/>

    Android10以上的还需要添加 添加明文权限:
    在AndroidManifest.xml的application中:

    android:usesCleartextTraffic=“true”

    StringRequest文本请求

    • 需要先获取RequestQueue对象
    • 然后获取StringRequest对象
    • 然后在使用RequestQueue对象.add()方法,将StringRequest对象设置进去
    /*** Creates a new GET request.** @param url URL to fetch the string at* @param listener Listener to receive the String response* @param errorListener Error listener, or null to ignore errors*/public StringRequest(String url, Listener<String> listener, @Nullable ErrorListener errorListener)
    //RequestQueue对象RequestQueue queue = Volley.newRequestQueue(this);//获取StringRequest对象		//这里url不方便透露 ,但可查看结果StringRequest stringRequest = new StringRequest(STRINGREQUEST_URL, new Response.Listener<String>() {@Override//正确返回public void onResponse(String response) {Log.i(\"StringRequestResponse\",response);}   //错误返回}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.i(\"onErrorResponse\",error.getMessage());}});//通过add()方法将RequestQueue 对象设置进去queue.add(stringRequest);

    注意:StringRequest()只建议用来请求文本信息

    康康Log返回结果吧:

    JsonObjectRequest获取JSON字符串GET和POST请求

    • 需要先获取RequestQueue对象
    • 然后获取JsonObjectRequest对象
    • 然后在使用RequestQueue对象.add()方法,将JsonObjectRequest对象设置进去
    /*** Creates a new request.** @param method the HTTP method to use* @param url URL to fetch the JSON from* @param jsonRequest A {@link JSONObject} to post with the request. Null indicates no*     parameters will be posted along with request.* @param listener Listener to receive the JSON response* @param errorListener Error listener, or null to ignore errors.*/public JsonObjectRequest(int method,String url,@Nullable JSONObject jsonRequest,Listener<JSONObject> listener,@Nullable ErrorListener errorListener)

    GET请求

    //获取RequestQueue对象RequestQueue queue = Volley.newRequestQueue(this);//获取JsonObjectRequest对象JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(\"http://www.weather.com.cn/data/city3jdata/china.html\", null, new Response.Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {Log.i(\"JsonObjectResponse\", response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.i(\"JsonObjectResponse\", error.getMessage());}});//使用RequestQueue对象.add()方法,将JsonObjectRequest对象设置进去queue.add(jsonObjectRequest);

    来康康Log吧:

    可以看到返回的是JSONObject,还需要通过原生的JSONObject解析才能得出最终想要的结果,所以说请求网络数据并不建议使用这种办法,建议使用Retrofit或者OkHttp等

    POST请求

    使用基本都一直,就不在重复说了,

    这里需要注意的是:

    • POST请求JsonObjectRequest()第一个参数得是Request.Method.POST.
    • POST请求通过JSONObject()的方式来设置参数
    Map params = new HashMap();params.put(\"app_key\", \"74D2E724FE2B69EF7EA3F38E9400CF71\");//创建原生的JSONObject将map设置进去JSONObject jsonObject = new JSONObject(params);/***      参数一:POST声明*      参数二: 请求POST路径*      参数三:JSONObject设置POST的key和value*      参数四:成功返回JSONObject*      参数五:错误返回*/JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url, jsonObject , new Response.Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {Log.i(\"JsonObjectResponse\", response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.i(\"JsonObjectonResponse\", response.toString());}});queue.add(jsonObjectRequest);

    来康康结果吧,正常情况返回请求码为200,则请求成功:

    如我所愿,返回码确实为200;

    ImageRequest设置图片

    /*** Creates a new image request, decoding to a maximum specified width and height. If both width* and height are zero, the image will be decoded to its natural size. If one of the two is* nonzero, that dimension will be clamped and the other one will be set to preserve the image\'s* aspect ratio. If both width and height are nonzero, the image will be decoded to be fit in* the rectangle of dimensions width x height while keeping its aspect ratio.** @param url URL of the image* @param listener Listener to receive the decoded bitmap* @param maxWidth Maximum width to decode this bitmap to, or zero for none* @param maxHeight Maximum height to decode this bitmap to, or zero for none* @param scaleType The ImageViews ScaleType used to calculate the needed image size.* @param decodeConfig Format to decode the bitmap to* @param errorListener Error listener, or null to ignore errors*/public ImageRequest(String url,Response.Listener<Bitmap> listener,int maxWidth,int maxHeight,Config decodeConfig,Response.ErrorListener errorListener)

    用法基本一直,这里就不细说了,要有参数不懂,可以看源码注释!

    //获取RequestQueue 对象RequestQueue queue = Volley.newRequestQueue(this);//获取ImageRequest 对象/**第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小*/ImageRequest imageRequest = new ImageRequest(\"http://api.map.baidu.com/images/weather/day/zhenyu.png\", new Response.Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {//设置bitmap图片Log.i(\"ImageRequestResponse\",\"1111\");mImage.setImageBitmap(response);}}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.i(\"onErrorResponse111\",error.getMessage()+\"\");}});queue.add(imageRequest);

    可以看到,image图片设置成功!

    ImageLolder

    ImageLoader可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求;

    • 创建一个RequestQueue对象。
    • 创建一个ImageLoader对象。
    • 获取一个ImageListener对象。
    • 调用ImageLoader的get()方法加载网络上的图片。
    //RequestQueue对象。RequestQueue requestQueue = Volley.newRequestQueue(this);/*** 参数一:RequestQueue对象* 参数二:ImageCache()对象*/ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {@Override   //public Bitmap getBitmap(String url) {Log.i(\"ImageLoadergetBitmap\",url+\"\");return null;}@Overridepublic void putBitmap(String url, Bitmap bitmap) {//设置图片给image2image2.setImageBitmap(bitmap);Log.i(\"ImageLoaderputBitmap\",url+\"\\t\\t\"+bitmap);}});/***     参数一:需要设置的ImageView对象*     参数二:在图片加载过程中显示默认图片*     参数三:图片加载失败显示*///将图片设置给imageImageLoader.ImageListener imageListener = ImageLoader.getImageListener(mImage, R.drawable.ic_launcher_foreground, R.drawable.ic_launcher_background);/***  参数一:图片接口*  参数二:  ImageLoader.ImageListener对象*  参数三:最大宽度*  参数四:最大高度*/imageLoader.get(\"http://api.map.baidu.com/images/weather/night/duoyun.png\",imageListener,200,200);

    将图片同时设置给iamge,和image2,来康康效果吧:

    使用非常的简单,但是重复代码比较多,看着很不美观,下一篇(点击查看).给大家写成一个工具类,方便大家以后使用:

    Git链接: langyangyang.

    欢迎各位大佬指出不足的地方!请在评论区留言吧~

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Android 网络请求框架(一) Volley