您的位置:首页 > 移动开发 > Android开发

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

2015-08-13 14:37 417 查看
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);
	}


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