Android Volley框架的基本使用解析
来源:互联网 发布:社会学属于法学吗 知乎 编辑:程序博客网 时间:2024/06/06 02:02
Volley是2013年Google在I/O大会上推出了一个新的网络通信框架。
Volley可以说集成了AsyncHttpClient和Universal-Image-Loader的优点。同时在性能上也进行了大幅度的调整,非常适合进行数据量不大,但是通信频繁的网络请求。
但是对于大数据量的网络操作,比如下载文件等的,Volley就表现的比较糟糕了。
Volley特点:
- 通信更快、更简单
- Get、Post网络请求及网络图像的高效率一部处理请求
- 对网络请求进行排序
- 网络请求的缓存
- 多级别取消请求
- 和Activity生命周期的联动
为什么使用Volley?
功能上:
- 高效的Get/Post方式的数据请求交互
- 网络图片加载和缓存
其他:
- 谷歌官方推出
- 性能很稳定和强劲
Android之Volley框架的使用
1.Volley的get和post请求方式的使用
挑选合适的对象:
- StringRequest //对请求返回的结果不确定是什么类型时使用的,可以涵盖下面两个对象
- JsonObjectRequest
- JsonArrayRequest
- 同时Volley还提供了请求的回调
首先来了解StringRequest的用法:GET请求方式
首先要准备Volley.jar包,这个随便就可以在网上down下来,down下来就直接导入项目。
然后准备一个消息请求的队列,全局的:
/** * Created by Layne_Yao on 2017-12-20 上午10:02:56. * CSDN:http://blog.csdn.net/Jsagacity */public class MyApplication extends Application { public static RequestQueue queues; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); queues = Volley.newRequestQueue(getApplicationContext()); } public static RequestQueue getHttpQueues(){ return queues; }}
然后几个在AndroidManifest.xml里面添加这一句,顺带也添加网络请求权限:
接下来就发出一个Http请求了:
/** * StringRequest方式的Get请求 */ public static void volleyStringRequestGet() { String url = "http://apis.juhe.cn/mobile/get?phone=13160863974&key=335adcc4e891ba4e4be6d7534fd54c5d"; // 这是StringRequest的请求方式 StringRequest request = new StringRequest(Method.GET, url, new Listener<String>() { // 请求成功的回调 @Override public void onResponse(String arg0) { Log.e("TAG", arg0); } }, new Response.ErrorListener() { // 请求失败的回调 @Override public void onErrorResponse(VolleyError arg0) { Log.e("TAG", arg0.toString()); } }); // 将请求添加到请求队列中 MyApplication.getHttpQueues().add(request); }
请求结果:
StringRequest的用法:POST请求方式
/** * StringRequest方式的Post请求 */ public static void volleyStringRequestPost() { String url = "http://apis.juhe.cn/mobile/get?"; // 这是StringRequest的请求方式 StringRequest request = new StringRequest(Method.POST, url, new Listener<String>() { @Override public void onResponse(String arg0) { Log.e("TAG", arg0); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { Log.e("TAG", arg0.toString()); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> hashMap = new HashMap<String, String>(); hashMap.put("phone", "13160863974"); hashMap.put("key", "335adcc4e891ba4e4be6d7534fd54c5d"); return hashMap; } }; // 添加到请求队列里面 MyApplication.getHttpQueues().add(request); }
结果和GET请求是一样的,这里就不演示了。
JsonObjectRequest的用法:GET请求方式
/** * JsonObjectRequest方式的Get请求 */ public static void volleyJsonObjectRequestGet() { String url = "http://apis.juhe.cn/mobile/get?phone=13160863974&key=335adcc4e891ba4e4be6d7534fd54c5d"; // 这是JsonObjectRequest的请求方式 JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null, new Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.e("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.toString()); } }); MyApplication.getHttpQueues().add(request); }
运行结果是一样的:
JsonObjectRequest的用法:POST请求方式
/** * JsonObjectRequest方式的Post请求 */ public static void volleyJsonObjectRequestPost() { String url = "http://apis.juhe.cn/mobile/get?"; // 这是JsonObjectRequest的请求方法 HashMap<String, String> map = new HashMap<String, String>(); map.put("phone", "13160863974"); map.put("key", "335adcc4e891ba4e4be6d7534fd54c5d"); JSONObject object = new JSONObject(map); JsonObjectRequest objectRequest = new JsonObjectRequest(Method.POST, url, object, new Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.e("TAG", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.toString()); } }); MyApplication.getHttpQueues().add(objectRequest); }
这个我的KEY也没有改动过,检查了几遍都不晓得是什么问题,就没有深究。
最后就是还有一个JsonArrayRequest,这里就不演示了,用法基本相似的。
2.Volley的取消队列网络请求和Volley与Activity生命周期的联动
原理基本差不多的。这里就演示在Activity销毁的时候,同时关闭请求。请求函数的处理,其实就是打了个标签:
/** * StringRequest方式的Get请求 */ public static void volleyStringRequestGet() { String url = "http://apis.juhe.cn/mobile/get?phone=13160863974&key=335adcc4e891ba4e4be6d7534fd54c5d"; // 这是StringRequest的请求方式 StringRequest request = new StringRequest(Method.GET, url, new Listener<String>() { // 请求成功的回调 @Override public void onResponse(String arg0) { Log.e("TAG", arg0); } }, new Response.ErrorListener() { // 请求失败的回调 @Override public void onErrorResponse(VolleyError arg0) { Log.e("TAG", arg0.toString()); } }); //给这个请求打个有意义的标签,到时可以根据这个标签找到这个请求 request.setTag("abcGET"); // 将请求添加到请求队列中 MyApplication.getHttpQueues().add(request); }
而后在Activity的周期函数里添加这样一行代码,就可以在Activity退出时,也取消该请求,甚至关闭整个请求队列
@Override protected void onStop() { super.onStop(); MyApplication.getHttpQueues().cancelAll("abcGET"); }
3.Volley的简单的二次回调封装
先封装一个请求回调接口
/** * Created by Layne_Yao on 2017-12-20 下午1:54:34. * CSDN:http://blog.csdn.net/Jsagacity */public abstract class VolleyInterface { public Context mContext; public static Listener<String> mListener; public static ErrorListener mErrorListener; public VolleyInterface(Context context, Listener<String> listener, ErrorListener errorListener) { this.mContext = context; this.mListener = listener; this.mErrorListener = errorListener; } public abstract void onMySuccess(String result); public abstract void onMyError(VolleyError error); public Listener<String> loadingListener() { mListener = new Listener<String>() { @Override public void onResponse(String response) { onMySuccess(response); } }; return mListener; } public ErrorListener errorListener() { mErrorListener = new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { onMyError(error); } }; return mErrorListener; }}
然后封装请求:
/** * Created by Layne_Yao on 2017-12-20 下午1:46:43. * CSDN:http://blog.csdn.net/Jsagacity */public class VolleyRequest { public static StringRequest stringRequest; public static Context context; public static void RequestGet(Context context, String url, String tag, VolleyInterface volleyInterface) { //检查还有没有同样的请求,如果有就关闭 MyApplication.getHttpQueues().cancelAll(tag); //生成StringRequest的Get请求 stringRequest = new StringRequest(Method.GET, url, volleyInterface.loadingListener(), volleyInterface.errorListener()); //添加tag标签 stringRequest.setTag(tag); //添加进请求队列中 MyApplication.getHttpQueues().add(stringRequest); MyApplication.getHttpQueues().start(); } public static void RequestPost(Context context, String url, String tag, final Map<String, String> params, VolleyInterface volleyInterface) { MyApplication.getHttpQueues().cancelAll(tag); stringRequest = new StringRequest(url, volleyInterface.loadingListener(), volleyInterface.errorListener()){ @Override protected Map<String, String> getParams() throws AuthFailureError { return params; } }; stringRequest.setTag(tag); MyApplication.getHttpQueues().add(stringRequest); MyApplication.getHttpQueues().start(); }}
最后简单的请求就完成了:
/** * 使用二次回调的Get请求方式 */ public static void volleyCallBackGet(final Context context) { String url = "http://apis.juhe.cn/mobile/get?phone=13160863974&key=335adcc4e891ba4e4be6d7534fd54c5d"; String tag = "abcGet"; VolleyRequest.RequestGet(context, url, tag, new VolleyInterface( context, VolleyInterface.mListener, VolleyInterface.mErrorListener) { @Override public void onMySuccess(String result) { Log.e("TAG", result); } @Override public void onMyError(VolleyError error) { Log.e("TAG", error.toString()); } }); }
运行结果:
4.Volley加载图片的介绍及用法
- 缓存功能简单介绍
- 加载网络图片及监听
ImageRequest的请求方式
首先来简答的使用一下ImageRequest的图片请求方式:
//ImageRequest的方式 public static void volleyImage(final ImageView imageView) { String url = "https://www.baidu.com/img/bdlogo.png"; ImageRequest request = new ImageRequest(url, new Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); } }, 0, 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { imageView.setBackgroundResource(R.drawable.ic_launcher); } }); MyApplication.getHttpQueues().add(request); }
在布局里面添加一个ImageView,在activity找到,调用上面函数是传进去就可以了,运行结果:
ImageLoader加LruCache图片缓存的方式
先封装图片的缓存BitmapCache类:
/** * Created by Layne_Yao on 2017-12-20 下午3:52:50. * CSDN:http://blog.csdn.net/Jsagacity */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) { // TODO Auto-generated method stub return value.getRowBytes() * value.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { // TODO Auto-generated method stub return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { // TODO Auto-generated method stub cache.put(url, bitmap); }}
而后进行图片网络请求:
//ImageLoader加ImageCache图片缓存的方式 public static void volleyImageTwo(ImageView imageView) { String url = "https://www.baidu.com/img/bdlogo.png"; 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); }
运行结果:
NetworkImageView方式
NetworkImageView不同于以上两种方式是NetworkImageView是一个自定义控件,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。
在布局中添加:
<com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" />
进行网络图片请求:
//NetworkImageView的方式請求 public static void volleyImageThree(NetworkImageView networkImageView){ String url = "https://www.baidu.com/img/bdlogo.png"; ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache()); //设置请求期间的显示 networkImageView.setDefaultImageResId(R.drawable.ic_launcher); //设置请求失败的显示 networkImageView.setErrorImageResId(R.drawable.ic_launcher); networkImageView.setImageUrl(url, loader); }
运行结果:
以上就是对Volley框架的简单使用。
源码下载
- Android Volley框架的基本使用解析
- Android Volley网络框架的基本使用
- Android 开源框架Volley完全解析,Volley的基本用法。
- Android 网络访问框架 Volley 基本使用
- android常见框架基本使用之-Volley
- Android Volley 框架的使用
- Android Volley 框架的使用
- Android Volley框架的使用
- Android Volley 框架的使用
- android 框架 volley 解析
- Android Volley框架解析
- Android Volley框架解析
- Android volley框架的基本应用
- Android Volley框架的基本用法
- Android Volley完全解析(一),初识Volley的基本用法
- Android Volley完全解析(一),初识Volley的基本用法
- Android Volley完全解析(一),初识Volley的基本用法
- Android Volley完全解析(一),初识Volley的基本用法
- 交换机开启Telnet服务
- AndroidStudio升级到3.0 implementation、api、compile 的区别
- SparseArray的使用及实现原理
- 机械键盘的选择的一些建议
- 源代码安装setuptools
- Android Volley框架的基本使用解析
- Egret 资源管理器中各个文件和文件夹的功能
- Java基础题_=、final、Integer、
- eclipse+maven
- oj 先序生成树以及print()queue
- JZOJ 5068. 【GDSOI2017第二轮模拟】树
- v$session & v$process各字段的说明
- Winpcap 开发教程
- 离屏渲染(Pbuffer)