前面写过一篇关于Volley源码的分析,本次介绍Volley的使用方法,使用Volley真的不是什么难事,只是为了帮助入门的童鞋能够快速的使用,大神绕道即可!
一、准备
1、新建一个Android工程,并在AndroidManifest中添加权限<uses-permission android:name="android.permission.INTERNET" />
2、下载volley.jar文件,拷贝到工程目录下的libs文件夹中,此时Eclipse将自动把jar包添加到工程的library。部分不会自动添加貌似是lib文件夹,针对不自动加入到的,可以手动添加,操作图示如下:
选择Add to Build Path即可。
二、创建一个管理RequestQueue的管理器
RequestQueue为Volley业务处理的核心中转器,我们用户在使用的时候直接通过RequestQueue来使用就可以了。创建一个用于管理RequestQueue对象的类ResourceManager,代码如下:
public class RequestManager {
private RequestQueue mRequestQueue;
private PersistentCookieStore mCookieStore;
public RequestManager(Context context) {
mCookieStore = new PersistentCookieStore(context.getApplicationContext());
mCookieStore.removeAll();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setCookieHandler(new CookieManager(mCookieStore, CookiePolicy.ACCEPT_ALL));
mRequestQueue = Volley.newRequestQueue(context, new OkHttpStack(okHttpClient));
start();
}
private static RequestManager mInstance;
public static RequestManager getInstance() {
if (mInstance == null) {
synchronized (RequestManager.class) {
mInstance = new RequestManager(MyApplication.getApp());
}
}
return mInstance;
}
public void start() {
mRequestQueue.start();
}
public void stop() {
mRequestQueue.stop();
}
public void addRequest(Request<?> request) {
addRequest(request, null);
}
public void addRequest(Request<?> request, RetryPolicy retryPolicy) {
if (request == null) {
return;
}
if (retryPolicy == null) {
retryPolicy = RequestManager.newDefaultRetryPolicy();
}
request.setRetryPolicy(retryPolicy);
mRequestQueue.add(request);
}
public void cancelAll() {
mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
return true;
}
});
}
public static DefaultRetryPolicy newDefaultRetryPolicy() {
return new DefaultRetryPolicy();
}
public static DefaultRetryPolicy newLongRetryPolicy() {
return new DefaultRetryPolicy(1000 * 60, 1, 0);
}
}
public class OkHttpStack extends HurlStack {
private OkHttpClient okHttpClient;
/**
* Create a OkHttpStack with default OkHttpClient.
*/
public OkHttpStack() {
this(new OkHttpClient());
}
/**
* Create a OkHttpStack with a custom OkHttpClient
*
* @param okHttpClient Custom OkHttpClient, NonNull
*/
public OkHttpStack(OkHttpClient okHttpClient) {
this.okHttpClient = okHttpClient;
}
@Override
protected HttpURLConnection createConnection(URL url) throws IOException {
OkUrlFactory okUrlFactory = new OkUrlFactory(okHttpClient);
HttpURLConnection urlConnection = okUrlFactory.open(url);
urlConnection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0");
return urlConnection;
}
}
创建完这两个类之后,剩下的具体实现工作就交给Volley内部去实现了。要注意在创建RequestManager的时候,要开始启用RequestQueue.start,这样才能驱动内部工作。
三、使用
这里演示中网络上获取一张图片,首先要先准备好图片的URL,大体的思路是创建一个获取图片的请求,然后将请求添加到RequestQueue中,就这么简单
RawRequest rawRequest = new RawRequest(addr, new Response.Listener<byte[]>() {
@Override
public void onResponse(byte[] data) {
synchronized (mResourceTask) {
mResourceTask.remove(addr);
}
try {
f.createNewFile();
FileOutputStream out = new FileOutputStream(f);
out.write(data);
out.close();
if (cb != null)
cb.onSuccess(id, filePath);
} catch (Exception e) {
if (cb != null)
cb.onError();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
LogUtil.loge("down load resource failed: " + addr);
synchronized (mResourceTask) {
mResourceTask.remove(addr);
}
if (cb != null)
cb.onError();
}
});
RequestManager.getInstance().addRequest(rawRequest);
如果程序执行成功,将会回调onResponse方法,反之发生异常则回调Response.ErrorListener方法。将下载下的数据保存到文件中,通过Drawable.createFromPath(文件名)就可以获取到下载后的图片了。