您的位置:首页 > 理论基础 > 计算机网络

Volley网络请求框架简析——Android网络请求框架(三)

2016-07-02 00:37 555 查看
题记——

        人来到这个世界上,只有两件事情,生与死,

        一件事完了,另一件事还急什么?

        有缘而来,无缘而去,

        识自本心,见自本性

        不起妄缘,无心无为

        自由自在,动静自如

        冷暖自知,则是修行







1、初始化一个消息请求队列以及网络请求工具类对象

/**
* Created by androidlongs on 16/7/1.
* 网络请求访问框架
*/
public class VollyRequestUtils {
/**
* Volley框架使用工具类对象
*/
private static VollyRequestUtils vollyRequestUtils;
/**
* 网络消息请求队列
*/
private static RequestQueue requestQueue;
private VollyRequestUtils() {
/**
* 初始化请求消息队列
*/
getVolleyQueyInstanse();
}

/**
* 获取消息工具类请求对象实体
*
* @return
*/
public static VollyRequestUtils getInstance() {
if (vollyRequestUtils == null) {
synchronized (VollyRequestUtils.class) {
if (vollyRequestUtils == null) {
vollyRequestUtils = new VollyRequestUtils();
}
}
}
return vollyRequestUtils;
}

/**
* 获取消息请求队列
*/
public void getVolleyQueyInstanse() {
if (requestQueue == null) {
synchronized (VollyRequestUtils.class) {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(App.getContext());
}
}
}

}

}


备注说明:

        这里采用单例设计模式,其中创建请求消息队列 requestQueue传入的是一个Application对象 

public class App extends Application {
private  static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this;
}
public static  Context getContext(){
return context;
}
}


切记要在程序的清单文件中引入

2、Get网络请求返回String 

/**
* get 请求
*
* @param url           网络请求url
* @param netTag        网络请求标识
* @param isCache       设置缓存标识
* @param listener      请求成功回调
* @param errorlistener 请求失败回调
*/
public void asyGetStringRequest(String url, String netTag, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorlistener) {

/**
* 在发起请求前先取消队列中有此标签的网络,避免多次重复请求问题
*/
requestQueue.cancelAll(netTag);
/**
* 获取请求对象
* 并设置相关的监听
*/
StringRequest request = new StringRequest(Request.Method.GET, url, listener, errorlistener);
/**
* 设置网络请求标识
*/
request.setTag(netTag);
/**
* 设置网络请求缓存
*/
request.setShouldCache(isCache);
/**
* 添加到队列中
*/
requestQueue.add(request);
}


使用方法:

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
final String netTag = "getString";

VollyRequestUtils.getInstance().asyGetStringRequest(url, netTag, false, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
System.out.println("get String success " + s);
}

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println("get String onErrorResponse " + volleyError.getMessage());
}
});


3、POST请求提交参数形式为KEY - VALUE 形式请求

/**
* post请求 提交KEY - VALEU 形式的数据
*
* @param url
* @param netTag
* @param map
* @param isCache
* @param listener
* @param errorListener
*/
public void asyncPostStringQuest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorListener) {

/**
* 取消此标识下的所有网络请求,避免重复提交
*/
requestQueue.cancelAll(netTag);
/**
* 获取Request对象 并封装相应的参数
*/
StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
/**
* 封装请求参数
*/
if (map != null && !map.isEmpty()) {
return map;
} else {
return super.getParams();
}
}
};
/**
* 设置缓存
*/
request.setShouldCache(isCache);
/**
* 设置网络请求标识
*/
request.setTag(netTag);
requestQueue.add(request);
}
使用方法:

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
final String netTag = "postString";

Map<String, String> map = new HashMap<>();
map.put("username", "postUsername");
map.put("password", "postPassword");

VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
System.out.println("post String success " + s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println("post String onErrorResponse " + volleyError.getMessage());
}
});
}


4、post请求提交参数为JSON形式

/**
* 提交 JSON数据到服务器
*
* @param url           网络请求URL
* @param netTag        网络请求标识
* @param map           网络请求提交参数
* @param isCache       缓存请求标识
* @param listener      成功监听
* @param errorListener 失败监听
*/
public void asynePostJsonObjRequest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {

requestQueue.cancelAll(netTag);
/**
* 封装参数
*/
JSONObject object = new JSONObject();
try {

if (map != null && !map.isEmpty()) {
for (Map.Entry<String, String> entry : map.entrySet()) {
object.put(entry.getKey(), entry.getValue());
}
}

} catch (Exception e) {
e.printStackTrace();
}
/**
* 创建请求Request
*/
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object, listener, errorListener);
/**
* 设置网络请求标识
*/
jsonObjectRequest.setTag(netTag);
/**
* 设置缓存
*/
jsonObjectRequest.setShouldCache(isCache);
requestQueue.add(jsonObjectRequest);
}


使用方法:

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
final String netTag = "postString";

Map<String, String> map = new HashMap<>();
map.put("username", "postUsername---45");
map.put("password", "postPassword---45");

VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener<JSONObject>(){

@Override
public void onResponse(JSONObject jsonObject) {
JSONObject j = jsonObject;
}
},new Response.ErrorListener(){

@Override
public void onErrorResponse(VolleyError volleyError) {

}
});


5、加载图片请求

/**
* 加载图片请求
* @param url            加载图片的URL
* @param netTag         加载图片的网络请求标识
* @param imageMaxWidth  加载图片的最大宽度
* @param imageMaxHeight 加载图片的最大高度
* @param listener       加载成功监听
* @param errorListener  加载失败监听
*/
public void asyPostImageRequest(String url, String netTag, int imageMaxWidth, int imageMaxHeight, Response.Listener<Bitmap> listener, Response.ErrorListener errorListener) {
requestQueue.cancelAll(netTag);

/**
* 创建获取request
* 并设置相关的监听与参数
*/

ImageRequest request = new ImageRequest(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX, Bitmap.Config.ARGB_8888, errorListener);

/**
* 设置加载缓存
*/
request.setShouldCache(true);
/**
* 设置网络请求标识
*/
request.setTag(netTag);
/**
* 设置请求超时时间
*/
request.setRetryPolicy(new DefaultRetryPolicy(15000,3000,3000));
requestQueue.add(request);
}


使用方法

final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
final String netTag = "imagerequest";

VollyRequestUtils.getInstance().asyPostImageRequest(url, netTag, screeWidht, screeHeight, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
System.out.println("image request success ");
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println("image request faile ");
}
});




6、使用Volley内置ImageLoader 加载图片

/**
* 加载多张图片
*
* @param url
* @param imageView
* @param imageMaxWidth
* @param imageMaxHeight
*/
public void asyVolleyImageLoaderRequest(String url, ImageView imageView, int imageMaxWidth, int imageMaxHeight) {
ImageLoader imageLoaderInstance = getImageLoaderInstance();
// getImageListener(imageView控件对象,默认图片地址,失败图片地址);
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
// get(图片地址,listener,宽,高);自动帮你处理图片的宽高再也不怕大图片的oom了
imageLoaderInstance.get(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX);
}

private static ImageLoader imageLoader;

/**
* 获取 Imageloader对象
* @return
*/
private ImageLoader getImageLoaderInstance() {
if (imageLoader == null) {
synchronized (VollyRequestUtils.class) {
if (imageLoader == null) {
imageLoader = new ImageLoader(requestQueue, new BitmapLruCache());
}
}
}
return imageLoader;
}


使用方法

final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
final String netTag = "postString";

VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);


在这里使用到了一个缓存对象类

public class  BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
/**
* LruCache 原理:Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。
* 当cache已满的时候加入新的item时,在队列尾部的item会被回收。
* 解释:当超出指定内存值则移除最近最少用的图片内存
*/
public static int getDefaultLruCacheSize() {
// 拿到最大内存
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 拿到内存的八分之一来做图片内存缓存
final int cacheSize = maxMemory / 8;

return cacheSize;
}

public BitmapLruCache() {
this(getDefaultLruCacheSize());
}

public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}

@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}

@Override
public Bitmap getBitmap(String url) {
return get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}

}


7、使用Volley提供的NetworkImageView加载图片

布局文件中的xml中使用方法

<com.android.volley.toolbox.NetworkImageView
android:layout_marginTop="10dp"
android:id="@+id/network_image_view"
android:layout_width="100dp"
android:layout_height="100dp" />


java代码中的操作

/**
* 这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题,而且NetworkImageView还会根据你对图片设置的width和heigh自动压缩该图片不会产生多的内存,还有NetworkImageView在列表中使用不会图片错误
*
* @param iv
* @param url
*/
private void networkImageViewUse(NetworkImageView iv, String url) {
ImageLoader imLoader = new ImageLoader(Volley.newRequestQueue(App.getContext()), new BitmapLruCache());
iv.setDefaultImageResId(android.R.drawable.ic_menu_rotate);
iv.setErrorImageResId(android.R.drawable.ic_delete);
iv.setImageUrl(url, imLoader);
}


8、自定义Request请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息