[AS2.2]Volley小记

记录Volley的用法,本篇大部分都来自于郭神的Volley全解析系列

Android Volley完全解析(一),初识Volley的基本用法

Android Volley完全解析(二),使用Volley加载网络图片

Android Volley完全解析(三),定制自己的Request

看了三篇,第四篇源码讲解就没涉及到了


volley的适用范围

数据量不大,但网络通信频繁的网络交互


目录

1.普通使用

2.图片使用

3.自定义自己的请求

4.全部代码



1.普通使用

volley的请求方式都是以一个RequestQueue为基石做到,所以先创建一个RequestQueue对象

RequestQueue mQueue = Volley.newRequestQueue(this);

之后就是创建各种请求,创建之后再加入到RequestQueue中进行实现。


先将布局文件贴出来


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.gjn.volleydemo.MainActivity">

    <Button
        android:text="get请求"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/btn_get" />

    <Button
        android:text="post请求"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_get"
        android:layout_alignStart="@+id/btn_get"
        android:id="@+id/btn_post" />

    <Button
        android:text="Json请求"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_post"
        android:layout_alignStart="@+id/btn_post"
        android:id="@+id/btn_json" />

    <Button
        android:text="Image请求"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_json"
        android:layout_alignStart="@+id/btn_json"
        android:id="@+id/btn_img" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_imgloader"
        android:text="ImageLoader"
        android:layout_below="@+id/btn_img"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:id="@+id/iv_img"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"
        android:layout_width="200dp"
        android:layout_height="200dp" />

    <Button
        android:text="NetworkImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_net_img"
        android:layout_below="@+id/btn_imgloader"
        android:layout_centerHorizontal="true" />

    <view
        class="com.android.volley.toolbox.NetworkImageView"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:id="@+id/iv_net_img"
        android:layout_width="180dp"
        android:layout_height="180dp" />

    <Button
        android:text="xml请求"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_get"
        android:layout_toStartOf="@+id/btn_net_img"
        android:layout_marginEnd="14dp"
        android:id="@+id/btn_xml" />
</RelativeLayout>


1.1 默认get请求

                StringRequest getrequest = new StringRequest("http://www.baidu.com",
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {
                                showTip("加载成功");
                                Log.e("Success", s);
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(getrequest);
首先创建一个StringRequest 请求对象

实现之后再 加入到RequestQueue中  就实现了get请求

默认没有传入Method的请求是get方式的请求。

1.2 post请求

                StringRequest postRequest = new StringRequest(Request.Method.POST,"http://www.baidu.com"
                , new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        showTip("加载成功");
                        Log.e("Success", s);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                })
                {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> map = new HashMap<>();
                        map.put("key1","value1");
                        map.put("key2","value2");
                        return map;
                    }
                };
                mQueue.add(postRequest);

设置了请求方式POST,还实现了一个getParams方法进行post数据的设置


1.3 json请求

                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://gank.io/api/data/Android/10/1"
                        , null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        showTip("加载成功");
                        Log.e("Success", jsonObject.toString());
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(jsonObjectRequest);

json请求其实和正常的get或者post差不多,但是返回的对象是JSONObject。

经过普通使用,我们发现 

StringRequest就是返回String 

JSONObjectRequest就是返回JSONObject

如果点击源码也会发现 写法上面也很相似,这就是为最后的自定义自己的请求做了一个模板。

2.图片使用

2.1 图片请求

                ImageRequest imageRequest = new ImageRequest("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-24-18094714_158946097967074_5909424912493182976_n.jpg"
                        , new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        iv_img.setImageBitmap(bitmap);
                        showTip("加载成功");
                    }
                }, 0, 0, Bitmap.Config.RGB_565
                        , new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(imageRequest);

新来的这个图片请求就和上面的请求都差很多了。

说明下参数  

第一个是 url  

第二个是 返回的图片 Bitmap  

第三,第四个是 是否需要压缩图片,0表示不压缩

第五个 是生成的RGB信息设置

第六个 还是错误信息


2.2 ImageLoader使用

默认的ImageRequest请求写法上面 比较繁琐,所以官方自己封装了一个方法ImageLoader,实现网络图片的缓存等设置,优化了许多。

首先先创建一个缓存机制  继承与ImageCache
BitmapCache.java
package com.gjn.volleydemo;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader;

/**
 * BitmapCache
 * Author: gjn.
 * Time: 2017/4/25.
 */
public class BitmapCache implements ImageLoader.ImageCache {

    private LruCache<String, Bitmap> mCache;

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

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

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

之后再来看下ImageLoader的用法

                ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
                ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_img,
                        R.mipmap.ic_launcher,R.mipmap.ic_launcher);
                imageLoader.get("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-18-17882540_190116561497334_440657494176432128_n.jpg"
                        ,listener);

首先把基石RequestQueue和缓存机制传入到ImageLoader 中

之后创建监听事件,设置图片的显示点ImageView  和默认图片以及错误图片

最后在加载图片url


2.3 NetworkImageView使用

NetworkImageView 是 Volley的一个自定义ImageView  使用方便简洁

                ImageLoader netImageLoader = new ImageLoader(mQueue, new BitmapCache());
                iv_net_img.setDefaultImageResId(R.mipmap.ic_launcher);
                iv_net_img.setErrorImageResId(R.mipmap.ic_launcher);
                iv_net_img.setImageUrl("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-16-17934400_1738549946443321_2924146161843437568_n.jpg"
                        ,netImageLoader);

用法上面简单了很多!


3.自定义自己的请求

XML请求

看了普通使用,就可以实现继承Request做简单的自定义请求

先将代码贴出来

XMLRequest.java

package com.gjn.volleydemo;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * XMLRequest
 * Author: gjn.
 * Time: 2017/4/25.
 */
public class XMLRequest extends Request<XmlPullParser> {

    private Response.Listener<XmlPullParser> mListener;

    public XMLRequest(int method, String url, Response.Listener<XmlPullParser> listener,
                      Response.ErrorListener errorListener){
        super(method,url,errorListener);
        mListener = listener;
    }

    public XMLRequest(String url, Response.Listener<XmlPullParser> listener,
                      Response.ErrorListener errorListener){
        super(Method.GET,url,errorListener);
        mListener = listener;
    }

    @Override
    protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {

        try {
//            String xmlString = new String(response.data,
//                    HttpHeaderParser.parseCharset(response.headers));
            String xmlString = new String(response.data,parseCharset(response.headers));
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();
            xmlPullParser.setInput(new StringReader(xmlString));
            return Response.success(xmlPullParser,HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (XmlPullParserException e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(XmlPullParser xmlPullParser) {
        this.mListener.onResponse(xmlPullParser);
    }

    private String parseCharset(Map<String, String> headers) {
        String contentType = (String)headers.get("Content-Type");
        if(contentType != null) {
            String[] params = contentType.split(";");

            for(int i = 1; i < params.length; ++i) {
                String[] pair = params[i].trim().split("=");
                if(pair.length == 2 && pair[0].equals("charset")) {
                    return pair[1];
                }
            }
        }

        return "utf-8";
    }
}

下面开始 讲解下

首先继承Request必须要实现的两个方法

parseNetworkResponse

这个方法是将获取到的内容转化为最后成功你获取到的参数类型


deliverResponse

这个方法是将转化好的参数传给监听


然后构造方法是有要求的 就是一定要实现 super(method,url,errorListener)

就是一定需要 请求方式  url 和错误的监听


正确的监听由我们自己编写并实现


这边在提下就是 

由于郭神提供的xml读取网址上面的 Content-Type 是text/xml  如果使用原来的编码方式,获取到的值会是乱码,所以我重写了下parseCharset方法


也就是将编码方式改成了utf-8而已!


4.全部代码

MainActivity.java

package com.gjn.volleydemo;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_get, btn_post,btn_json,btn_img,btn_imgloader,btn_net_img,btn_xml;
    private RequestQueue mQueue;
    private ImageView iv_img;
    private NetworkImageView iv_net_img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mQueue = Volley.newRequestQueue(this);

        initview();
        initclick();
    }

    private void initclick() {
        btn_get.setOnClickListener(this);
        btn_post.setOnClickListener(this);
        btn_json.setOnClickListener(this);
        btn_img.setOnClickListener(this);
        btn_imgloader.setOnClickListener(this);
        btn_net_img.setOnClickListener(this);
        btn_xml.setOnClickListener(this);
    }

    private void initview() {
        btn_get = (Button) findViewById(R.id.btn_get);
        btn_post = (Button) findViewById(R.id.btn_post);
        btn_json = (Button) findViewById(R.id.btn_json);
        btn_img = (Button) findViewById(R.id.btn_img);
        btn_imgloader = (Button) findViewById(R.id.btn_imgloader);
        btn_net_img = (Button) findViewById(R.id.btn_net_img);
        btn_xml = (Button) findViewById(R.id.btn_xml);

        iv_img = (ImageView) findViewById(R.id.iv_img);
        iv_net_img = (NetworkImageView) findViewById(R.id.iv_net_img);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_get:
                StringRequest getrequest = new StringRequest("http://www.baidu.com",
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {
                                showTip("加载成功");
                                Log.e("Success", s);
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(getrequest);
                break;
            case R.id.btn_post:
                StringRequest postRequest = new StringRequest(Request.Method.POST,"http://www.baidu.com"
                , new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        showTip("加载成功");
                        Log.e("Success", s);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                })
                {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> map = new HashMap<>();
                        map.put("key1","value1");
                        map.put("key2","value2");
                        return map;
                    }
                };
                mQueue.add(postRequest);
                break;
            case R.id.btn_json:
                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://gank.io/api/data/Android/10/1"
                        , null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        showTip("加载成功");
                        Log.e("Success", jsonObject.toString());
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(jsonObjectRequest);
                break;
            case R.id.btn_img:
                ImageRequest imageRequest = new ImageRequest("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-24-18094714_158946097967074_5909424912493182976_n.jpg"
                        , new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        iv_img.setImageBitmap(bitmap);
                        showTip("加载成功");
                    }
                }, 0, 0, Bitmap.Config.RGB_565
                        , new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(imageRequest);
                break;
            case R.id.btn_imgloader:
                ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
                ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_img,
                        R.mipmap.ic_launcher,R.mipmap.ic_launcher);
                imageLoader.get("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-18-17882540_190116561497334_440657494176432128_n.jpg"
                        ,listener);
                break;
            case R.id.btn_net_img:
                ImageLoader netImageLoader = new ImageLoader(mQueue, new BitmapCache());
                iv_net_img.setDefaultImageResId(R.mipmap.ic_launcher);
                iv_net_img.setErrorImageResId(R.mipmap.ic_launcher);
                iv_net_img.setImageUrl("http://7xi8d6.com1.z0.glb.clouddn.com/2017-04-16-17934400_1738549946443321_2924146161843437568_n.jpg"
                        ,netImageLoader);
                break;
            case R.id.btn_xml:
                XMLRequest xmlRequest = new XMLRequest("http://flash.weather.com.cn/wmaps/xml/china.xml"
                        , new Response.Listener<XmlPullParser>() {
                    @Override
                    public void onResponse(XmlPullParser response) {
                        showTip("加载成功");
                        try {
                            int eventType = response.getEventType();
                            while (eventType != XmlPullParser.END_DOCUMENT) {
                                switch (eventType) {
                                    case XmlPullParser.START_TAG:
                                        String nodeName = response.getName();
                                        if ("city".equals(nodeName)) {
                                            String pName = response.getAttributeValue(0);
                                            Log.d("TAG", "pName is " + pName);
                                        }
                                        break;
                                }
                                eventType = response.next();
                            }
                        } catch (XmlPullParserException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        showTip("加载失败\n" + volleyError.getMessage());
                    }
                });
                mQueue.add(xmlRequest);
                break;

        }
    }

    private void showTip(String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值