一、Android Volley 开源框架的使用
2013年Google I/O大会上推出了一个新的网络通信框架——Volley。它既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。
除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
1、Volley ImageRequest 加载网络图片示例
** 此方法已经弃用,随便了解下
(1)在AS中添加依赖库 implementation 'com.mcxiaoke.volley:library:1.0.19'
(2)XML 布局文件只有一个Button 、一个ImageView 较简单此处省略
(3)MainActivity.java文件如下
public class MainActivity extends Activity {
private Button imgRequest;
private ImageView imageView;
private Volley volley;
private RequestQueue requestQueue;
private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = volley.newRequestQueue(MainActivity.this); //初始化请求队列
imageView = findViewById(R.id.image);
imgRequest = findViewById(R.id.btn1);
imgRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//ImageRequest构造函数需要6个参数
ImageRequest imageRequest = new ImageRequest(imgUrl, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(imageRequest); //将请求添加到请求队列里面
}
});
}
}
2、Volley ImageLoader 加载网络图片示例
ImageLoader 加载图片并实现缓存,界面很简单,一个Button + ImageView。添加依赖库同上,直接上代码。
(1)布局XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="imageLoader" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"/>
</LinearLayout>
(2)MainActivity.java代码
public class MainActivity extends Activity {
private static final String TAG = "MainActivity" ;
private Button btnImg;
private ImageView imageView;
private Volley volley;
private RequestQueue requestQueue;
private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";
private MyImageCache myImageCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = volley.newRequestQueue(MainActivity.this);
myImageCache = new MyImageCache();
imageView = findViewById(R.id.image);
btnImg = findViewById(R.id.btn1);
btnImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImageLoader imageLoader = new ImageLoader(requestQueue, myImageCache);
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView,
R.drawable.moren,R.drawable.cuowu); //图片控件、默认图片、错误图片
imageLoader.get(imgUrl,imageListener);
}
});
}
}
class MyImageCache implements ImageLoader.ImageCache { //自定义缓存类
private static final String TAG = "MyImageCache";
private LruCache<String,Bitmap> lruCache; //lru 最近最少使用算法
public MyImageCache(){
int maxSize = 10 * 1024 * 1024; //最大为10M
lruCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight(); //得到图片的size
}
};
}
@Override
public Bitmap getBitmap(String url) {
Bitmap bitmap = lruCache.get(url);
if (bitmap == null){
Log.e(TAG,"getBitmap failed bitmap == null");
}else {
Log.e(TAG,"getBitmap success bitmap != null");
}
return bitmap; //从缓存中拿到图片
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
if (bitmap == null){
Log.e(TAG,"putBitmap failed bitmap == null");
}else {
Log.e(TAG,"putBitmap success bitmap != null");
}
lruCache.put(url,bitmap); //如果缓存中没有,从网络拿
}
}
首次运行肯定拿不到缓存图片,因此会打印 getBitmap failed bitmap == null , 接着从网络拿图片
putBitmap success bitmap != null ,后面再点击button的时候都会从缓存拿图片,将打印
getBitmap success bitmap != null 。
08-27 04:07:16.638 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap failed bitmap == null
08-27 04:07:16.944 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: putBitmap success bitmap != null
08-27 04:07:42.281 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap success bitmap != null
08-27 04:07:44.233 14236-14236/com.nxyuntui.mapyuntui E/MyImageCache: getBitmap success bitmap != null
3、Volley NetworkImageView 加载网络图片示例
在上面两个步骤的基础上,学习NetworkImageView加载网络图片,较简单。
(1)MainActivity.java
public class MainActivity extends Activity {
private static final String TAG = "MainActivity" ;
private Button netImg;
private NetworkImageView imageView; //定义NetworkImageView 组件
private Volley volley;
private RequestQueue requestQueue;
private String imgUrl = "http://pic33.nipic.com/20131007/13639685_123501617185_2.jpg";
private MyImageCache myImageCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestQueue = volley.newRequestQueue(MainActivity.this);
myImageCache = new MyImageCache(); //MyImageCache 类同上
imageView = findViewById(R.id.netImage);
netImg = findViewById(R.id.btn1);
netImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImageLoader imageLoader = new ImageLoader(requestQueue, myImageCache);
imageView.setDefaultImageResId(R.drawable.moren);
imageView.setErrorImageResId(R.drawable.cuowu);
imageView.setImageUrl(imgUrl,imageLoader);
}
});
}
}
(2)布局XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="netImagview" />
<com.android.volley.toolbox.NetworkImageView // NetworkImageView控件
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/netImage"/>
</LinearLayout>