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

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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值