简介
Volley是在2013年Google I/O大会上推出了一个新的网络通信框架,内部封装了HttpURLConnection和HttpClient, 解决了网络数据解析和线程切换的问题。今天不详解Volley的具体原理,只是简单地讲下怎么利用Volley获取网络图片和加载它.
步骤如下:
1.添加volley依赖
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
2.采用Volley框架自定义的挂载图片控件NetWorkImageView
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jasonwang.loadernetpicture.MainActivity">
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/niv_pic"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
3.请求网络图片的主要方法
package com.example.jasonwang.loadernetpicture;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.LruCache;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
public class MainActivity extends AppCompatActivity {
private NetworkImageView nivImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nivImageView = (NetworkImageView) findViewById(R.id.niv_pic);
getPicFromNetWork(); //获取网络图片
}
int maxSize = 5 * 1024 * 1024; //定义缓存的大小:5M
public void getPicFromNetWork() {
final String url = "http://imgsrc.baidu.com/baike/pic/item/b3fb43166d224f4aa657f6540af790529922d1af.jpg";
//创建请求队列对象
RequestQueue requestQueue = Volley.newRequestQueue(this);
///创建图片缓存区对象
ImageLoader.ImageCache imageCache = new MyLruCache(maxSize);
//创建图片加载器对象
final ImageLoader imageLoader =new ImageLoader(requestQueue,imageCache);
//将网络图片加载都控件里
nivImageView.setImageUrl(url,imageLoader);
}
/**
* 定义自己的图片缓存区,这里的缓存只是一级缓存(也就是内存缓
*存)
*/
class MyLruCache extends LruCache<String,Bitmap> implements ImageLoader.ImageCache{
/**
* @param maxSize for caches that do not override {@link #sizeOf}, this is
* the maximum number of entries in the cache. For all other caches,
* this is the maximum sum of the sizes of the entries in this cache.
*/
public MyLruCache(int maxSize) { //定义缓存的大小
super(maxSize);
}
/**
*获取要缓存的图片的大小,检查是否会爆仓
* @param key
* @param value
* @return
*/
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
/**
* 从缓存中获取图片
* @param url
* @return
*/
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
/**
* 将图片存入缓存中
* @param url
* @param bitmap
*/
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
}
注意:Volley获取网络图片跟流行的Picasso,Glide开源框架不太一样,Volley底层是没有封装好图片缓存区,需要自己定义肯定会有小伙伴问我,明明有其他那么多封装好的框架不用,还要用这个.因为我想告诉大家如果用Volley获取网络图片的话该如何定义图片缓存
4.添加网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
好了,看下我帅气的偶像胡歌吧
![](https://img.haomeiwen.com/i6150640/8287f2c2aa8b6af7.png)
网友评论