您的位置:首页 > 其它

Volley 简单使用

2015-12-06 16:22 295 查看
git仓库https://github.com/mcxiaoke/android-volley

一、配置

在build.gradle文件中加:
compile 'com.mcxiaoke.volley:library:1.0.17'


二、前期准备

1、在AndroidManifest.xml文件中加权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>


2、重写Application:(详情看代码)

package com.example.yvan.netall;

import android.app.Application;
import android.text.TextUtils;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

/**
* Created by Administrator on 2015/12/6.
*/
public class MyApplication extends Application {

//默认TAG
public static final String TAG = MyApplication.class.getSimpleName();

//请求队列(一般一个app一个请求队列就可以了)
private RequestQueue mRequestQueue;

//图片加载器(一般一个app一个图片加载器就可以了)
private ImageLoader mImageLoader;

private static MyApplication appInstance;

@Override
public void onCreate() {
super.onCreate();
appInstance = this;
}

/**
* 单例模式 得到MyApplication的对象
*
* @return
*/
public static synchronized MyApplication getAppInstance() {
return appInstance;
}

/**
* 得到请求队列
* 一个app使用一个请求队列就可以了(一般情况下)
*
* @return
*/
public RequestQueue getmRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}

/**
* 获取ImageLoader(图片加载器)
*
* @return
*/
public ImageLoader getmImageLoader() {

//保证mRequestQueue不是空的
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
//LruBitmapCache()下文有解释
if (mImageLoader == null) {
mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache());
}

return mImageLoader;
}

/**
* 将请求request加入请求队列,并给该请求设置标志tag
*
* @param request
* @param tag
* @param <T>
*/
public <T> void addToRequestQueue(Request<T> request, String tag) {

//给request设置标志tag,如果tag为空,就设置成默认的TAG
request.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getmRequestQueue().add(request);
}

/**
* 将请求request加入请求队列,并给该请求设置默认的TAG
*
* @param request
* @param <T>
*/
public <T> void addToRequestQueue(Request<T> request) {
request.setTag(TAG);
getmRequestQueue().add(request);
}

/**
* 取消等待中的请求
*
* @param tag 根据tag取消对应的请求
*/
public void cancelPendingRequest(String tag) {
if (mRequestQueue != null) {
//取消所有标志为tag的请求
mRequestQueue.cancelAll(tag);
}
}
}


图片缓冲

package com.example.yvan.netall;

import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.toolbox.ImageLoader;

/**
* 图片缓冲 LruCache
* Created by Administrator on 2015/12/6.
*/
public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

public LruBitmapCache(int maxSize) {
super(maxSize);
}

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

/**
* 获取默认的图片缓冲大小
*
* @return
*/
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int lruCacheSize = maxMemory / 8;

return lruCacheSize;
}

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

/**
* 从缓冲中得到图片
* @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);
}
}


三、Get和Post方法

无非就是几种Request:StringRequest、JsonObjectRequest、JsonArrayRequest、ImageRequest、自定义Request,选好某个Request后,就可以将该request加入到请求队列中,就算完成了一个网络请求。

1、StringRequest的应用

StringRequest如果要添加请求参数就加上getParams()方法,如果要添加请求头就加上getHeaders()方法;反之,删除。如下:

StringRequest的第一个参数决定请求的方法(Get或Post)

第二参数是URL

第三个参数是请求成功后返回的结果

第四个参数是请求失败后的错误信息

/**
* StringRequest的应用
*/
StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.GET, url, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {
//在UI线程中
Log.e(TAG,"Vollye数据:"+response.toString());
}
}, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//在UI线程中
VolleyLog.d(TAG,"Error:"+error.getMessage());
}
}){
//如果是Post或者Get方法有请求参数,可以在此方法中添加,如果没有请求参数,就删除此方法
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//添加自己的请求参数
Map<String,String> paramsMap = new HashMap<>();

return paramsMap;
}

//这是添加Http的头文件,如果不需要添加头文件,就删除此方法
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
//添加自己的头文件
Map<String,String> headersMap = new HashMap<>();
return headersMap;
}
};

//这个就是调用Application中的方法,添加到请求队列中,完成网络请求,这是在新的线程中运行的
MyApplication.getAppInstance().addToRequestQueue(stringRequest);


2、JsonRequest:JsonObjectRequest和JsonArrayRequest是JsonRequest的直接子类

类似StringRequest的用法,只是参数不同

/**
* JsonObjectRequest的应用
*/
String tag = "json_obj_req";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(com.android.volley.Request.Method.GET, url, "",
new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
long tid = Thread.currentThread().getId();
Log.e(TAG, "volley线程id:" + tid);

Log.e(TAG, "volley返回的数据:" + response.toString());
}
},
new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e(TAG, "Error:" + error.getMessage());
}
}
);

MyApplication.getAppInstance().addToRequestQueue(jsonObjectRequest, tag);


3、ImageRequest:

类似StringRequest,如下:

参数:第三、四个参数代表图片的最大宽、高,如果图片大于该宽、高,就要压缩,如果是0,就表示不做任何处理,图片多大,就显示多大;第五个参数是图片质量。

/**
* 下载图片并加载
* @param url
* @param imageView
*/
public static void downloadSetBitmap(String url, final ImageView imageView){
ImageRequest imageRequest = new ImageRequest(url, new com.android.volley.Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

//如果下载出错,设置默认图片
imageView.setImageResource(R.mipmap.ic_launcher);
Log.e(TAG,"下载图片出错:"+error.getMessage());
}
});

MyApplication.getAppInstance().addToRequestQueue(imageRequest);
}


`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: