Android开发--Volley框架

 Volley简介

       Volley是2013年谷歌发布的一款Android平台上的网络通信库,非常适合一些数据量不大,需要频繁通信的网络操作。在android开发中,使用Volley可极大提升我们的开发效率,同时保证性能的稳定性。虽然Volley如此好,但却不适用于文件的上传、下载。

Volley的特点

1、 使网络通信更快,更简单,更健壮;

2、 Get/Post网络请求及网络图像的高效率异步请求;

3、 可以对网络请求的优先级进行排序处理;

4、可以进行网络请求的缓存;

5、 可以取消多级别请求;

6、 可以和Activity生命周期联动。

Volley使用步骤

1、第一步:

下载一个volley.jar包导入libs文件下,下载地址http://download.csdn.net/detail/u010049692/7813127

2、第二步:添加权限

<!-- 添加网络操作权限 -->
<uses-permission android:name="android.permission.INTERNET"/>

3、第三步:在自定义Application中,建立全局的请求队列

public class MyApplication extends Application{
    private static RequestQueue queues ;
    @Override
    public void onCreate() {
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueues() {
        return queues;
    }
}

4、使用Get方式返回String类型

private void volleyGet() {
        String url = "https://xxx";
        StringRequest request = new StringRequest(Method.GET, url,
                new Listener<String>() {
                    @Override
                    public void onResponse(String s) {//s为请求返回的字符串数据
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                    }
                },
                new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
                    }
                }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError { //添加头信息
                Map<String, String> map = new HashMap<String, String>();
                map.put("accept", "application/json");           
                return map;
            }
        };
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testGet");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }

5、使用Get方式返回JsonObject类型

private void volleyGet() {
    String url = "https://xxx";
    JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null,
            new Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
                    Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show();
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
                }
            }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {  //添加头信息
            Map<String, String> map = new HashMap<String, String>();
            map.put("accept", "application/json");         
            return map;
        }
    };
    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testGet");
    //将请求加入全局队列中
    MyApplication.getHttpQueues().add(request);
}

6、使用Post方式返回String类型

private void volleyPost() {
    String url = "https://xxx";
    StringRequest request = new StringRequest(Method.POST, url,
            new Listener<String>() {
                @Override
                public void onResponse(String s) {//s为请求返回的字符串数据
                    Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
                }
            }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {  //添加请求参数
            Map<String, String> map = new HashMap<>();
            //将请求参数名与参数值放入map中
            map.put("user_login", "root");
            map.put("user_password", "123");
            return map;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError { //添加头信息
            Map<String, String> map = new HashMap<String, String>();
            map.put("accept", "application/json");
            return map;
        }
    };
    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testPost");
    //将请求加入全局队列中
    MyApplication.getHttpQueues().add(request);
}

7、使用Post方式返回JsonObject类型

创建JsonObject解析工具:

public class CustomRequest extends Request<JSONObject> {

    private Listener<JSONObject> listener;
    private Map<String, String> params;

    public CustomRequest(String url, Map<String, String> params,
                         Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    public CustomRequest(int method, String url, Map<String, String> params,
                         Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return params;
    };

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
    }
}

使用工具解析

private void volleyPostWithJsonObjectRequest() {
        String url = "https://dev.kuaidimao.com/xapi/rec_login";
        Map<String, String> map = new HashMap<>();
        map.put("user_login", "root");
        map.put("user_password", "123");
        //将map转化为JSONObject对象
        JSONObject jsonObject = new JSONObject(map);
        CustomRequest request = new CustomRequest(Request.Method.POST,
                url, map, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
            }
        });
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
//        request.setTag("testPost");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    } 

8、通过Volley加载网络图片

private void loadImageByVolley() {
    String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
    ImageRequest request = new ImageRequest(
            url,
            new Listener<Bitmap>() {
                @Override
                public void onResponse(Bitmap bitmap) {
                    image.setImageBitmap(bitmap);
                }
            },
            0, 0, Config.RGB_565,
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    image.setImageResource(R.mipmap.ic_launcher);
                }
            });

    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("loadImage");
    //通过Tag标签取消请求队列中对应的全部请求
    MyApplication.getHttpQueues().add(request);
}

9、Activity的生命周期联动

@Override
protected void onStop() {
    super.onStop();
    //通过Tag标签取消请求队列中对应的全部请求
    MyApplication.getHttpQueues().cancelAll("abcGet");
}
发布了20 篇原创文章 · 获赞 1 · 访问量 2817

猜你喜欢

转载自blog.csdn.net/baidu_27603429/article/details/89636210