网络请求框架(Volley)
1,介绍
-
Volley是什么?
-
2013年Google I/O大会上推出的网络请求和图片加载框架
-
其优点是api简单,性能优秀
-
非常适合数据量不大但是通信频繁的网络请求,而对于大数据量的操作,如文本下载,表现则没有那么好
-
Volley内部仍然是使用的HttpURLConnection和HttpClient进行网络请求的,只是对于不同的Android版本进行了响应的切换,2.3之前使用的HttpClient,2.3之后使用的是HttpURLConnection
-
-
为什么用Volley,相比XUtil,Volley解决了以下问题:
-
当用户finish当前的Activity的时候,而当前Activity正在进行网络请求,Volley支持取消网络请求
-
当用户旋转屏幕,Activity重新创建,那么同样的网络请求会从新发送,而Volley支持对重复的请求进行缓存
-
支持多样的网络请求返回封装
-
2,使用准备
【1】添加依赖和权限
-
添加依赖
compile 'com.android.volley:volley:1.0.0'compile 'com.google.code.gson:gson:2.8.0'
-
添加网络请求权限
【2】Volley中的核心类
-
Request,请求类,有几个实现类
-
StringRequest:请求的时候直接回来一个String
-
JsonObjectRequest:请求的时候直接回来一个JsonObject
-
JsonArrayRequest:请求的时候直接回来一个JsonArray
-
ImageRequest:请求的时候直接回来一个Bitmap
-
自定义请求:一会我们会结合gson
-
-
RequestQueue:请求队列,用来执行Request的
-
ImageLoader:图片加载的类
-
NetWorkImageView:继承自ImageView,可以直接加载网络图片
3,实现逻辑
【1】Volley get请求
-
接口文档
-
get请求
private void volleyGet() { //1.创建请求队列 RequestQueue requestQueue = Volley.newRequestQueue(this); //2.创建请求对象 StringRequest request = new StringRequest(Api.TEST, new Response.Listener() { @Override public void onResponse(String response) { tvResult.setText(response); } }, errListener); //3.执行请求 requestQueue.add(request);}Response.ErrorListener errListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { tvResult.setText(error.getMessage()); }};
【2】Volley post请求
-
接口文档
-
Volley内部没有提供设置请求参数,需要我们自定义进行封装
public class PostRequest extends StringRequest public PostRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) { super(Method.POST,url, listener, errorListener); } HashMap map = new HashMap<>(); @Override protected Map getParams() throws AuthFailureError { return map; } /** * 添加请求体参数 * @param key * @param value */ public void addPostParams(String key,String value){ map.put(key,value); }
-
post请求
private void volleyPost() { //1.创建请求队列 RequestQueue requestQueue = Volley.newRequestQueue(this); //2.创建请求对象 PostRequest request = new PostRequest(Api.LOGIN, new Response.Listener() { @Override public void onResponse(String response) { tvResult.setText(response); } },errListener); //设置请求体参数 request.addPostParams("username","The Monkey King!"); request.addPostParams("password","golden cudgel!"); //3.执行请求 requestQueue.add(request);}//失败回调Response.ErrorListener errListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { tvResult.setText(error.getMessage()); }};
【3】ImageRequest进行请求
-
接口文档
-
进行图片请求
private void imageReq() { RequestQueue queue = Volley.newRequestQueue(this); //参1 URL, 参2 Listener 参3 参4 图片的解析的大小 参5 颜色的模式 参6 失败监听 ImageRequest request = new ImageRequest(Api.IMAGE, new Response.Listener() { @Override public void onResponse(Bitmap response) { image.setImageBitmap(response); } }, 400, 400, Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { text.setText(error.getMessage()); } }); queue.add(request);}
【4】Volley中的ImageLoader使用
-
创建本地缓存
public class VolleyCache implements ImageLoader.ImageCache { private LruCache lruCache = null; //谷歌建议的:app最大内存的1/8 int maxSize = (int) (Runtime.getRuntime().maxMemory()/8);//缓存最大值 public VolleyCache(){ lruCache = new LruCache(maxSize){ @Override protected int sizeOf(String key, Bitmap value) { return value.getHeight()*value.getRowBytes(); } }; } @Override public Bitmap getBitmap(String url) { return lruCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { lruCache.put(url,bitmap); }}
-
进行图片下载,并且进行缓存,
private void loadImage() { RequestQueue queue = Volley.newRequestQueue(this); //创建本地缓存 VolleyCache volleyCache = new VolleyCache(); ImageLoader imageLoader = new ImageLoader(queue, volleyCache); //参1 Imageview ,参2 加载失败的图片, 参3 加载中的图片 ImageLoader.ImageListener listener = ImageLoader.getImageListener(image, R.mipmap.ic_launcher, R.mipmap.ic_launcher); //设置URL,设置监听 imageLoader.get(Api.IMAGE,listener);}
【5】Volley 取消中断网络请求
-
先创建一个请求,并且附加标识
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.text); image = (ImageView) findViewById(R.id.image); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { cancelRequest(); } }); queue = Volley.newRequestQueue(this); //一开始发送一个请求 StringRequest request = new StringRequest(Api.DELAY, new Response.Listener() { @Override public void onResponse(String response) { text.setText(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { text.setText(error.getMessage()); } }); //添加标识 request.setTag("a"); queue.add(request);//执行请求 }
-
取消网络请求
private void cancelRequest() { //取消 queue.cancelAll("a");}
【7】Volley 自定义请求,返回GsonRequest,进行封装解
-
创建GsonRequest继承Request
import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import java.io.UnsupportedEncodingException;public class GsonRequest extends Request{ private Class clazz; private Response.Listener mListener; public GsonRequest(String url,Class clazz, Response.Listener mListener,Response.ErrorListener listener) { super(Method.GET, url, listener); this.clazz = clazz; this.mListener = mListener; } //仿照StringRespnose @Override protected Response parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } //将json字符串解析为javabean T t = new Gson().fromJson(parsed, clazz); return Response.success(t, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(T response) { mListener.onResponse(response); }}
-
调用进行网络访问返回是Gson格式
queue = Volley.newRequestQueue(this); //进行初始化//参数1 URL,参2 JAVAbean 参3 成功监听,参4 失败监听GsonRequest gsonRequest = new GsonRequest<>(Api.TEST, User.class, new Response.Listener() { @Override public void onResponse(User response) { text.setText(response.name); }}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { }});queue.add(gsonRequest);
【8】Volley 的二次封装
-
Volley封装返回一个Gson
-
Volley封装返回一个图片设置到Imageview上
-
Volley封装取消请求
import android.animation.ObjectAnimator;import android.content.Context;import android.widget.ImageView;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;/**** 对Volley的二次封装*/public class VolleyHelper { RequestQueue queue; VolleyCache volleyCache = new VolleyCache(); ImageLoader imageLoader = new ImageLoader(queue, volleyCache); private static VolleyHelper mInstance = null; private VolleyHelper(Context context){ queue = Volley.newRequestQueue(context); } public static VolleyHelper create(Context context){ if(mInstance==null){ mInstance = new VolleyHelper(context); } return mInstance; } public void cancelRequest(Object tag){ queue.cancelAll(tag); } public void execRequest(String url,Class clazz, Response.Listener success, Response.ErrorListener error){ execRequest(url,null,clazz,success,error); } /** * 执行请求的方法 * @param url * @param clazz * @param success * @param error * @param */ public void execRequest(String url, Object tag, Class clazz, Response.Listener success, Response.ErrorListener error){ GsonRequest tGsonRequest = new GsonRequest<>(url, clazz, success, error); if(tag!=null){ tGsonRequest.setTag(tag); } queue.add(tGsonRequest); } /** * 加载图片的方法 * @param url * @param imageView */ public void loadImage(String url, ImageView imageView){ ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher); imageLoader.get(url,listener); }}
-
Volley请求返回一个Gson
import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import java.io.UnsupportedEncodingException;public class GsonRequest extends Request{ private Class clazz; private Response.Listener mListener; public GsonRequest(String url,Class clazz, Response.Listener mListener,Response.ErrorListener listener) { super(Method.GET, url, listener); this.clazz = clazz; this.mListener = mListener; } @Override protected Response parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } //将json字符串解析为javabean T t = new Gson().fromJson(parsed, clazz); return Response.success(t, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(T response) { mListener.onResponse(response); }}
更多相关文章
- Android利用Fiddler进行网络数据抓包【怎么跟踪微信请求】
- Android笔记---常用控件以及用法
- Android(安卓)VideoView播放网络视频
- 【源码】Android(安卓)圆形图片之 CircleImageView 源码解读
- Android(安卓)手势检测实战 打造支持缩放平移的图片预览效果(下)
- Google Android(安卓)SDK开发范例大全
- Android屏幕适配小结
- Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数
- Android实践--监测网络状态