Android网络请求 ------ Volley的使用

来源:互联网 发布:湖北软件开发公司 编辑:程序博客网 时间:2024/05/01 22:34

Volley是Google官方的网络异步请求库,最大的特点是简单高效,多并发。但Volley不适合数据的上传和下载。

一、Get请求的使用

1、根据请求数据返回的形式选择合适的对象

Volley提供了StringRequest、JsonObjectRequest、JsonArrayRequest三种对象供我们选择。

(a)StringRequest ——- 主要用于我们不确定数据返回类型的情况。

(b)JsonObjectRequest ——- 主要用于返回的数据类型是JsonObject的情况。

(c)JsonArrayRequest ——- 主要用于返回的数据类型是JsonArray的情况。

注:StringRequest是包含其他两种类型的,选择使用最合适最接近的类型可以提升性能。

2、生成请求对象

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {    //成功的接口回调    @Override    public void onResponse(String s) {        Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();    }}, new Response.ErrorListener() {    //失败的接口回调    @Override    public void onErrorResponse(VolleyError volleyError) {      Toast.makeText(MainActivity.this,volleyError.toString(), Toast.LENGTH_LONG).show();    }});

3、创建请求队列,以便存放上面创建的请求

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;    }}

注:还要在AndroidManifest.xml文件中的application标签中加入刚才新建的MyApplication。

android:name=".MyApplication"

4、给请求设置tag标签

stringRequest.setTag("phone");

5、将请求加入请求队列

MyApplication.getHttpQueues().add(stringRequest);

二、Post请求的使用

Post请求的使用,绝大部分步骤是与Get请求是相同的,唯一的区别在于Get请求将要请求的参数以 ? + 键值对的方式接在链接之后,而Post请求需要重写其中的方法来传入参数,如下:

StringRequest str = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() {    @Override    public void onResponse(String s) {    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError volleyError) {    }}){    @Override    protected Map<String, String> getParams() throws AuthFailureError {        Map<String, String> map = new HashMap<>();        map.put("apikey", apiKey);        map.put("method", "publish");        map.put("appkey", "5316bd7179b6570f2ca6e20b");        map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb");        map.put("topic", "test_topic");        map.put("msg", "this is one message");        return map;    }};

上面我们都是只介绍了StringRequest类,假设我们返回的是JsonObject类型的数据,我们采用JsonObjectRequest类呢,其实大部分参数还是不变的,只是她的构造函数多了一个JsonObject类型的参数,用于传入需要POST的数据,如果是Get方式,则直接传入null,下面是一个简单的例子:

private void volleyPost() {final String apiKey = "f04a61e";String url = "http://apis.baidu.com/yunba/realtime_restful_api/publish";Map<String, String> map = new HashMap<>();map.put("apikey", apiKey);map.put("method", "publish");map.put("appkey", "5316bd7179b6570f2ca6e20b");map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb");map.put("topic", "test_topic");map.put("msg", "this is one message");JSONObject json = new JSONObject(map);JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, json, new Response.Listener<JSONObject>() {    @Override    public void onResponse(JSONObject jsonObject) {        Toast.makeText(MainActivity.this, "DD" + jsonObject.toString(), Toast.LENGTH_LONG).show();    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError volleyError) {        Toast.makeText(MainActivity.this, "F" + volleyError.toString(), Toast.LENGTH_LONG).show();    }});    jsonRequest.setTag("xiao");    MyApplication.getHttpQueues().add(jsonRequest);}

注:我们还应该在Activity的生命周期结束时,结束网络请求,所以我们需要在Activity的onStop()方法中添加如下一句:

MyApplication.getHttpQueues().cancelAll("tag");

三、使用Volley加载网络图片

Volley中加载网络图片有很多种方式:

1、使用ImageRequest加载网络图片

ImageRequest加载网路图片的方式和Volley中进行一般的网络请求差别不大,只是参数略有不同。参数依次为图片url、请求成功的回调、图片的最大宽度,最大高度(此处传入0则是用原始尺寸解码显示,传入其他数据则按比例进行缩放解码)、图片的缩放类型、图片的显示配置、请求失败的回调。下面是一个简单的例子:

/** * 网络请求并设置图片 */private void setImage() {    String url =     ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {        @Override        public void onResponse(Bitmap bitmap) {            imageView.setImageBitmap(bitmap);        }    }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() {        @Override        public void onErrorResponse(VolleyError volleyError) {            imageView.setBackgroundResource(R.mipmap.ic_launcher);        }    });    request.setTag("image");    MyApplication.getHttpQueues().add(request);}

注:图片的网路请求还是和前面一样需要设置tag,再加入请求队列中。

2、使用 LruCache、ImageCache和ImageLoader结合加载网络图片

我可以先定义一个类用于实现ImageCache,在其中结合LruCache完成对图片的缓存,这个类的实例将作为后面的参数传入。

public class BitmapCache implements ImageLoader.ImageCache {    public LruCache<String, Bitmap> cache;    //最大缓存为10M,当缓存大于设定值时将自动启动垃圾回收    public int max = 10 * 1024 * 1024;    public BitmapCache(){        //实例化cache        cache = new LruCache<String, Bitmap>(max){            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getRowBytes() * value.getHeight();            }        };    }    @Override    public Bitmap getBitmap(String s) {        //返回缓存中的图片        return cache.get(s);    }    @Override    public void putBitmap(String s, Bitmap bitmap) {        cache.put(s, bitmap);    }}

接下来我们需要获得ImageLoader的实例

//创建ImageLoader的实例(参数依次为请求队列和图片缓存)ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());

接着我们需要获得图片加载监听类的实例

imageView = (ImageView) findViewById(R.id.show_image);//创建图片加载监听实例(参数依次为图片显示控件实例,默认显示的图片的id,加载出错时显示的图片的id)ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);

最后我们传入相应的参数来加载图片

String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1472736685&di=ea36b0007865cef24d9d659c03b26485&src=http://img.sucai.redocn.com/attachments/images/201002/20100206/20100206_c3f11163684180e389c57LUEUjSMDaax.jpg";loader.get(url, listener);

3、使用Volley自带的NetworkImageView结合ImageLoader进行图片加载

首先获得ImageLoader的实例

//创建ImageLoader的实例(参数依次为请求队列和图片缓存)ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());

获得NetworkImageView的实例并设置简单的参数

//设置默认显示的图片      netImageview.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载错误时需要显示的图片      netImageview.setErrorImageResId(R.mipmap.ic_launcher);

最后设置需要加载的图片

//设置需要加载的图片netImageview.setImageUrl(url, loader);

以上就是我在学习Volley的过程中的一个简单的记录总结。

0 0
原创粉丝点击