前言
Volley这一个网络请求框架,是我第一个学习的的网络框架,距离现在已经有一段时间没有用到的,这一个框架,学习起来还是蛮快的,因为它使用起来简单,可以实现大部分的网络请求,非常适合入门新手学习!但是有一点需要注意的是,这一个框架
不适合做数据的上传和下载,这一点非常重要,切记!
1.Volley介绍
Volley就是齐射,并发的意思,是Google I/0 2013上发布的
网络通信库,用于请求网络数据不大但频繁
特点:
1.通信快,简单,
2.GET,POST的网络请求及网络图片的高效异步请求,
3.可以对网络请求进行排序,
4.网络的缓存,
5.多级别取消请求,
6和Activity生命周期联动
功能:
1.高效的GET.POST数据请求交互
2.网络图片加载与缓存
2.使用
1.添加包或者依赖
- AndroidStudio下添加gradle
compile 'com.mcxiaoke.volley:library:1.0.19'
- Eclipse下添加包
2.建立请求队列
- 在全局应用中设置队列
public class MyApplication extends Application {
//建立请求队列
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
//实例化请求队列
queue= Volley.newRequestQueue(getApplicationContext());
}
//暴露方法获取请求队列
public static RequestQueue getHttpQueues(){
return queue;
}
}
- AndroidManifest.xml文档中通过application标签设置属性android:name=上面的类,并添加请求网络权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rhyme.httptest">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".MyApplication"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3.创建请求对象,简单的GET请求
/**
* @param url 请求地址
* StringRequest(int method 请求类型,
* String url请求地址,
* Listener<String> listener请求成功回调,String response 返回的数据
* ErrorListener errorListener请求失败回调 VolleyError继承自异常Exception类)
*/
public void Volley_Get_String(String url){
StringRequest request=new StringRequest(StringRequest.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// TODO: 2017/9/7 Success
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: 2017/9/7 Error
}
});
//添加标签,将这个请求标记,方便在众多请求中识别,因为Volley用于频繁的网络请求
request.setTag("Tag_Get_String");
//将该条请求添加到全局队列中
MyApplication.getHttpQueues().add(request);
}
- 好的,让我们来传百度地址进这个方法,并在请求成功和失败都打印一下信息,可以看到百度的html文档
4.POST请求
/**
* @param url 请求地址
* @param params 请求参数
*/
public void Volley_POST_String(String url, final Map<String,String> params){
StringRequest request=new StringRequest(StringRequest.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// TODO: 2017/9/7 Success
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: 2017/9/7 Error
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
//添加标签,将这个请求标记,方便在众多请求中识别,因为Volley用于频繁的网络请求
request.setTag("Tag_POST_String");
//将该条请求添加到全局队列中
MyApplication.getHttpQueues().add(request);
}
5.取消请求
//cancelAll()取消传入的标签所有请求,一般放在onStop中
MyApplication.getHttpQueues().cancelAll("Tag_GET_String");
6.加载图片
/**
*ImageRequest(String url, 请求地址
* Response.Listener<Bitmap> listener, 请求成功返回bitmap
* int maxWidth, 最大宽度
* int maxHeight, 最大高度
* ScaleType scaleType, 图片缩放类型
* Config decodeConfig, 图片类型
* Response.ErrorListener errorListener 请求失败返回)
*/
public void Volley_LoadImage(String url, final View view, String tag){
ImageRequest imageRequest=new ImageRequest(
url
, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
((ImageView)view).setImageBitmap(response);
}
}
, 300
, 500
,ImageView.ScaleType.CENTER
, Bitmap.Config.RGB_565
, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: 2017/9/7 image set default picture
}
});
imageRequest.setTag(tag);
MyApplication.getHttpQueues().add(imageRequest);
}
7.加载图片,带缓存
1.添加缓存类实现ImageLoader.ImageCache
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String,Bitmap> cache;
private int max=10*1024*1024;//缓存大小,超过自动回收
public BitmapCache(){
cache=new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();//该大小是根据图片的
}
};
}
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url,bitmap);
}
}
2.加载图片方法
/**
* 加载图片,有缓存
* @param url 请求地址
*
* ImageLoader(RequestQueue queue, 请求队列
\ ImageCache imageCache)传入实现了ImageCache的类
* getImageListener(final ImageView view,要显示的视图
final int defaultImageResId, 默认图片
final int errorImageResId)//加载失败图片
*/
public void Volley_LoadImage_Cache(View view,String url){
ImageLoader loader=new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
ImageLoader.ImageListener listener=ImageLoader.getImageListener((ImageView) view,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
loader.get(url,listener);
}
3.NetWorkImageView( Volley的加载图片控件)
public void Volley_LoadImage_Cache(NetworkImageView view, String url){
ImageLoader loader=new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
view.setDefaultImageResId(R.mipmap.ic_launcher);//默认图片
view.setErrorImageResId(R.mipmap.ic_launcher);//加载失败图片
view.setImageUrl(url,loader);
}