【Android进阶】(2)使用开源框架Volley

1. 框架特点

(1). 通信更快,更简单

(2). Get、Post网络请求及网络图像的高效率异步处理请求

(3). 排序

(4). 网络请求的缓存

(5). 多级别取消请求

(6). 和Activity生命周期的联动

缺点:不适合上传和下载

优点:高效的Get/Post方式的数据请求交互,网络图片加载和缓存,是谷歌官方推出的框架,性能很稳定和强劲。

2. 网络数据请求

(1). 使用Get方式请求数据

创建Application类:

<span style="white-space:pre">	</span>public class MyApplication extends Application {

	public static RequestQueue queues;

	@Override
	public void onCreate() {
		super.onCreate();
		queues = Volley.newRequestQueue(getApplicationContext());
	}

	public static RequestQueue getHttpQueues() {
		return queues;
	}
}

使用StringRequest测试GET请求:

<span style="white-space:pre">	</span>private void volleyGetStringReuest() {
		String url = "http://apis.juhe.cn/mobile/get?phone=13689249616&key=d83212f9ca3a6028fa0d7d77a3ff3bf8";
		// 创建请求对象
		StringRequest request = new StringRequest(Method.GET, url,
				new Listener<String>() {

					// 请求成功时调用
					@Override
					public void onResponse(String arg0) {
						Toast.makeText(MainActivity.this, arg0, 0).show();
					}
				}, new Response.ErrorListener() {

					// 请求失败时调用
					@Override
					public void onErrorResponse(VolleyError arg0) {
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
					}
				});
		request.setTag("abcGet");
		MyApplication.getHttpQueues().add(request);
	}

使用JsonObjectRequest测试GET请求:

	private void volleyGetJsonObjectReuest() {
		String url = "http://apis.juhe.cn/mobile/get?phone=13689249616&key=d83212f9ca3a6028fa0d7d77a3ff3bf8";
		// 创建请求对象
		JsonObjectRequest request = new JsonObjectRequest(Method.GET, url,
				null, new Listener<JSONObject>() {

					// 请求成功
					@Override
					public void onResponse(JSONObject arg0) {
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
					}
				}, new Response.ErrorListener() {

					// 请求失败
					@Override
					public void onErrorResponse(VolleyError arg0) {
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
					}
				});
		request.setTag("abcGet");
		MyApplication.getHttpQueues().add(request);
	}

(2). 使用Post请求数据

使用StringRequest测试POST请求:

	private void volleyStringRequestPost() {
		String url = "http://apis.juhe.cn/mobile/get?";
		StringRequest request = new StringRequest(Method.POST, url,
				new Listener<String>() {

					@Override
					public void onResponse(String arg0) {
						Toast.makeText(MainActivity.this, arg0, 0).show();
					}
				}, new Response.ErrorListener() {

					@Override
					public void onErrorResponse(VolleyError arg0) {
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
					}
				}) {
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				Map<String, String> map = new HashMap<String, String>();
				map.put("phone", "13002909620");
				map.put("key", "d83212f9ca3a6028fa0d7d77a3ff3bf8");
				return map;
			}
		};
		request.setTag("abcGet");
		MyApplication.getHttpQueues().add(request);
	}

3. Volley与Activity联动

(1). Volley与Activity的联动

覆写onStop方法:

	@Override
	protected void onStop() {
		super.onStop();
		MyApplication.getHttpQueues().cancelAll("abcGet");
	}

(2). Volley的二次回调封装

首先要创建一个抽象类VolleyInterface:

public abstract class VolleyInterface {
	public Context mContext;
	public Listener<String> mListener;
	public ErrorListener mErrorListener;

	public abstract void onMySuccess(String result);

	public abstract void onMyError(VolleyError error);

	public VolleyInterface(Context context, Listener<String> listener,
			ErrorListener errorListener) {
		mContext = context;
		mListener = listener;
		mErrorListener = errorListener;
	}

	public Listener<String> loadingListener() {
		mListener = new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				onMySuccess(arg0);
			}
		};
		return mListener;
	}

	public ErrorListener errorListener() {
		mErrorListener = new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				onErrorResponse(arg0);
			}
		};
		return mErrorListener;
	}
}

然后创建一个类,自定义我们的GET和POST请求:

public class VolleyRequest {

	public static StringRequest stringRequest;
	public static Context context;

	/**
	 * 自定义GET
	 *
	 * @param context
	 * @param url
	 * @param tag
	 * @param vif
	 */
	public static void requestGet(Context context, String url, String tag,
			VolleyInterface vif) {
		MyApplication.getHttpQueues().cancelAll(tag);
		stringRequest = new StringRequest(Method.GET, url,
				vif.successListener(), vif.errorListener());
		stringRequest.setTag(tag);
		MyApplication.getHttpQueues().add(stringRequest);
		MyApplication.getHttpQueues().start();
	}

	/**
	 * 自定义POST
	 *
	 * @param context
	 * @param url
	 * @param tag
	 * @param params
	 * @param vif
	 */
	public static void requestPost(Context context, String url, String tag,
			final Map<String, String> params, VolleyInterface vif) {
		MyApplication.getHttpQueues().cancelAll(tag);
		stringRequest = new StringRequest(Method.POST, url,
				vif.successListener(), vif.errorListener()) {
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				return params;
			}
		};
		stringRequest.setTag(tag);
		MyApplication.getHttpQueues().add(stringRequest);
		MyApplication.getHttpQueues().start();
	}
}

修改测试的代码:

	/**
	 * 自定义get方式
	 */
	private void myGet() {
		String url = "http://apis.juhe.cn/mobile/get?phone=13689249616&key=d83212f9ca3a6028fa0d7d77a3ff3bf8";
		VolleyRequest.requestGet(this, url, "abcGet", new VolleyInterface(this,
				VolleyInterface.mListener, VolleyInterface.mErrorListener) {

			@Override
			public void onMySuccess(String result) {
				Toast.makeText(MainActivity.this, result, 0).show();
			}

			@Override
			public void onMyError(VolleyError error) {
				Toast.makeText(MainActivity.this, error.toString(), 0).show();
			}
		});
	}

这样做的好处是:我们可以在VolleyInterface中写好功和失败的两种处理方式,这样在每一个调用者都可以使用。

关于Post我就不做测试了。

4. 获取网络图片

(1). 使用ImageRequest获取网络图片

public class ImageActivity extends Activity {

	private ImageView imageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_image);
		initView();
		String url = "https://www.baidu.com/img/bdlogo.png";
		// 宽和高指定0和0就会以原图的方式加载
		ImageRequest request = new ImageRequest(url, new Listener<Bitmap>() {

			@Override
			public void onResponse(Bitmap arg0) {
				imageView.setImageBitmap(arg0);
			}
		}, 0, 0, Config.RGB_565, new Response.ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				imageView.setImageResource(R.drawable.ic_launcher);
			}
		});
		MyApplication.getHttpQueues().add(request);
	}

	private void initView() {
		imageView = (ImageView) findViewById(R.id.image);
	}
}

(2). 使用ImageLoader和ImageListener缓存网路图片

创建BitmapCache类:

public class BitmapCache implements ImageCache {

	public LruCache<String, Bitmap> cache;
	public 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 arg0) {
		return cache.get(arg0);
	}

	@Override
	public void putBitmap(String arg0, Bitmap arg1) {
		cache.put(arg0, arg1);
	}
}

调用测试:

	private void testImageLoader(String url) {
		ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),
				new BitmapCache());
		ImageListener listener = ImageLoader.getImageListener(imageView,
				R.drawable.ic_launcher, R.drawable.ic_launcher);
		loader.get(url, listener, 0, 0);
	}

(3). 使用ImageLoader和NetworkImageView加载图片:

	private void testNetworkImageView(String url) {
		ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),
				new BitmapCache());
		netImageView.setDefaultImageResId(R.drawable.ic_launcher);
		netImageView.setErrorImageResId(R.drawable.ic_launcher);
		netImageView.setImageUrl(url, loader);
	}

源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 02:42:39

【Android进阶】(2)使用开源框架Volley的相关文章

六款值得推荐的android(安卓)开源框架简介

1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http 项目地址:https://github.com/loopj/android-async-http

六款值得推荐的android(安卓)开源框架简介(转)

1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http 项目地址:https://github.com/loopj/android-asyn

六款值得推荐的android(安卓)开源框架简介(转)

1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载:(2) 网络请求的排序(scheduling)(3) 网络请求的优先级处理(4) 缓存(5) 多级别取消请求(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)2.android-async-http 项目地址:https://github.com/loopj/android-async-http文档介绍:h

Android开发常用流行开源框架记录

发掘了一些Android常用开源框架,记录并分享,希望能在开发当中帮到大家. 缓存: 名称:DiskLruCache 描述:Java实现基于LRU的硬盘缓存 源码地址(可能需要翻墙) 作者:guolin 相关博客:Android DiskLruCache完全解析,硬盘缓存的最佳方案 图片加载: Android-Universal-Image-Loader 描述:一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.所以,如果你的程序里需要这个功能的话,那么不妨

六款值得推荐的android(安卓)开源框架简介【转】

http://my.oschina.net/u/1244156/blog/380647 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-htt

六款值得推荐的android(安卓)开源框架

1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http 项目地址:https://github.com/loopj/android-asyn

Android 开发中使用开源框架 DataDroid

DataDroid 框架简介 DataDroid是基于Android平台的一个开源的开发库,基于Android 的RESTful封装用来简化Android应用中的数据管理.该开源库的下载地址为 CSDN资源. DataDriod 在Android项目中的使用 从github上clone下来的源代码中就有很多种类型的数据管理的demo,这里就简单得描述一下通过DataDroid的工作流程进行一个打开摄像头的过程.想看下面项目的源码的可以去我的github查看,地址:Github 1.以单例模式建立

Android示例应用:开源框架Glide的使用

Android开源框架Glide的使用-示例应用 加载网络图片 加载网络图片 加载本地图片-简易图库 加载网络图片 引入对应的库 compile 'com.android.support:recyclerview-v7:25.0.0' compile 'com.github.bumptech.glide:glide:3.7.0' 创建RecyclerView的布局res/layout/fragment_list.xml <?xml version="1.0" encoding=&

Android开源框架——Volley

Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架.特别适合数据量小,通信频繁的网络操作.Volley 主要是通过两种 Diapatch Thread 不断从 RequestQueue 中取出请求,根据是否已缓存调用 Cache 或 Network 这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由 ResponseDelivery 去做结果分发及回调处理. 原文链接:http://blog.csdn.net/zi