0%

使用Volley请求网络数据以及Glide图片加载库的使用

Volley 与 Glide、下拉刷新

网络请求开源库 OKhttp,Volley

1. Volley的简单使用

  1. 添加依赖

    1
    2
    //HTTP库 Volley
    implementation 'com.android.volley:volley:1.1.1'
  2. 创建请求队列

  3. 创建请求

  4. 将请求加入到请求队列中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //1. 创建请求队列
    RequestQueue queue = Volley.newRequestQueue(this);
    //2. 创建请求
    StringRequest request = new StringRequest(
    Request.Method.GET,//请求方法
    url,//请求的URL
    new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
    textView.setText(response);
    }
    },
    new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    Log.e(TAG, "onErrorResponse: " + error);
    }
    }
    );
    //3. 将请求加入到请求队列中
    queue.add(request);

2. 使用Volley加载图片

  1. 创建请求队列

  2. 创建图片加载器

  3. 将URL中的图像加载到ImageView中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    imageView = findViewById(R.id.imageView);


    //1. 创建请求队列
    RequestQueue queue = Volley.newRequestQueue(this);
    //2. 创建一个图片加载器,第一个参数是请求队列 第二个参数是cache 缓存
    ImageLoader imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
    private LruCache<String, Bitmap> cache = new LruCache<>(50);
    //LRU缓存机制 最近最久使用LRU的设计原理就是,
    // 当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。
    // 这就意味着,如果经常访问的数据,我们需要然其能够快速命中,而不常访问的数据,我们在容量超出限制内,要将其淘汰
    @Override
    public Bitmap getBitmap(String url) {
    return cache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
    cache.put(url, bitmap);
    }
    });
    //3. 将url中的图像添加到ImageView中
    imageLoader.get(url, new ImageLoader.ImageListener() {
    @Override
    public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
    imageView.setImageBitmap(response.getBitmap());
    }

    @Override
    public void onErrorResponse(VolleyError error) {
    Log.e(TAG, "onErrorResponse: " + error);
    }
    });

3. 使用Glide加载图片

  1. 添加依赖

    1
    2
    3
    //Glide库
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
  2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Glide.with(this)//context
.load(url)//图片URL
.placeholder(R.drawable.ic_launcher_background)//没有加载出来时的 占位图
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}

@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.into(imageView);

4. SwipeRefreshLayout

  1. 添加依赖

    1
    2
    //下拉刷新库
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
  2. 添加下拉刷新监听

    1
    2
    3
    4
    5
    6
    7
    //下拉刷新监听
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
    loadImage();
    }
    });
  3. 在下拉刷新动作结束后,将刷新动作停止

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public void loadImage() {
    Random random = new Random();
    String url = random.nextBoolean() ? url1 : url2;
    //使用Glide加载图片
    Glide.with(this)//context
    .load(url)//图片URL
    .placeholder(R.drawable.ic_launcher_background)//没有加载出来时的 占位图
    .listener(new RequestListener<Drawable>() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
    if(swipeRefreshLayout.isRefreshing()){
    swipeRefreshLayout.setRefreshing(false);//停止刷新
    }
    return false;
    }

    @Override
    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
    if(swipeRefreshLayout.isRefreshing()){
    swipeRefreshLayout.setRefreshing(false);//停止刷新
    }
    return false;
    }
    })
    .into(imageView);
    }