经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android网络请求(4) 网络请求框架Volley
来源:cnblogs  作者:高同学,你好  时间:2022/11/23 18:51:05  对本文有异议

Android网络请求(4) 网络请求框架Volley

Volley是Google在2013年5月15日到17日在旧金山Moscone中心举办网络开发者年会中推出的Android异步网络加载框架和图片加载框架,它特别适合数据体量小且通讯频繁的网络操作场景,而Android开发中大多数场景都是这样的,但是如果让它去进行文件上传下载之类的大数据量网络操作,那么他的表现将非常差。

那么让我们走进Volley,来熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一个图片加载框架NetworkImageView,我们也来一起了解一下吧。

导入依赖

Volley的历史不短,但是它的修改却很少,现在最高的版本也才1.2.1。我们使用的是1.1.1版本,现在build.gradle(app)中的dependencies中导入依赖

  1. implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'

网络请求

Get请求

  1. // 请求地址
  2. String src = "https://www.baidu.com";
  3. // 创建请求队列
  4. RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
  5. // 创建请求
  6. StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
  7. @Override
  8. public void onResponse(String response) {//成功时返回的response数据
  9. String s = response.toString();
  10. System.out.println(s);
  11. }
  12. }, new Response.ErrorListener() {
  13. @Override
  14. public void onErrorResponse(VolleyError error) {//失败时返回的error信息
  15. String message = error.getMessage();
  16. System.out.println(message);
  17. }
  18. });
  19. // 将请求添加至队列中,否则不会发起请求
  20. requestQueue.add(request);

直接在MainActivity中进行网络请求,这与我们之前的方式不太一样,这是因为Volley请求代码比OkHtpp还要简短,监听都可以new+空格+回车 自动弹出,我们只需要管理返回的数据即可,而且创建的请求队列并不只能使用一次,这是一个队列,可以加入多个请求,所以,我们只需要创建请求并且导入到这个队列中即可。

Post请求

post请求比get请求多一些参数,首先就是在创建请求时要去指定请求为post,因为默认请求时get,其次需要重写一个方法用于传递post请求所携带的参数,如果不这么做的话,就会报错。

  1. // 请求地址
  2. String src = "https://xxx.xxx.com";
  3. // 创建请求队列
  4. RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
  5. // 创建请求,添加请求类型
  6. StringRequest request = new StringRequest(Request.Method.POST ,src, new com.android.volley.Response.Listener<String>() {
  7. @Override
  8. public void onResponse(String response) {//成功时返回的response数据
  9. String s = response.toString();
  10. System.out.println(s);
  11. }
  12. }, new Response.ErrorListener() {
  13. @Override
  14. public void onErrorResponse(VolleyError error) {//失败时返回的error信息
  15. String message = error.getMessage();
  16. System.out.println(message);
  17. }
  18. }){
  19. // post请求一定要传入参数否则报错
  20. @Override
  21. protected Map<String, String> getParams() throws AuthFailureError {
  22. Map<String, String> map = new HashMap<>();
  23. map.put("username","123456");
  24. map.put("password","123456");
  25. return map;
  26. }
  27. };
  28. // 将请求添加至队列中,否则不会发起请求
  29. requestQueue.add(request);

Put请求

Put请求就不说了,只需要修改请求方法即可

Delete请求

delete请求如果需要携带参数,可以在post请求的基础上修改请求方法,如果不携带参数可以在get请求的基础上添加请求方法。

Json数据请求

我们注意到了,我们返回的都是String类型的值,我们日常开发中返回的值大多数时json格式的,那么我们怎么样去请求json数据呢。Volley提供了JsonObjectRequest和JsonArrayRequest这两个类可用于返回json数据。它的使用方法和StringRequest是一样的,只需要修改一些参数即可。另外他不在需要通过重写方法来传递参数,可以直接将你需要的参数转换成json格式,在实例化JsonObjectRequest时传入

Get请求

  1. // 请求地址
  2. String src = "https://www.baidu.com";
  3. // 创建请求队列
  4. RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
  5. // 创建请求,添加请求类型
  6. JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
  7. @Override
  8. public void onResponse(JSONObject response) {//成功时返回的response数据
  9. String s = response.toString();
  10. System.out.println(s);
  11. }
  12. }, new Response.ErrorListener() {
  13. @Override
  14. public void onErrorResponse(VolleyError error) {//失败时返回的error信息
  15. String message = error.getMessage();
  16. System.out.println(message);
  17. }
  18. });
  19. // 将请求添加至队列中,否则不会发起请求
  20. requestQueue.add(request);

Post

  1. // 请求地址
  2. String src = "https://www.baidu.com";
  3. // 创建请求队列
  4. RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
  5. // 创建参数
  6. JSONObject data = new JSONObject();
  7. try {
  8. data.put("username","123");
  9. data.put("password","123");
  10. } catch (JSONException e) {
  11. e.printStackTrace();
  12. }
  13. // 创建请求,添加请求类型
  14. // 顺序是 请求方法 请求地址 请求携带的数据 监听器
  15. JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
  16. @Override
  17. public void onResponse(JSONObject response) {//成功时返回的response数据
  18. String s = response.toString();
  19. System.out.println(s);
  20. }
  21. }, new Response.ErrorListener() {
  22. @Override
  23. public void onErrorResponse(VolleyError error) {//失败时返回的error信息
  24. String message = error.getMessage();
  25. System.out.println(message);
  26. }
  27. });
  28. // 将请求添加至队列中,否则不会发起请求
  29. requestQueue.add(request);

Put

在post基础上修改请求方法即可

delete

判断是否携带参数并且post或get中修改即可

网络图片加载框架

1、通过ImageRequest请求网络图片

这种方法是通过ImageRequest来请求一张图片转换为Bitmap格式,在返回的Bitmap中对ImageView进行设置图片,较为简单。

  1. img = (ImageView) findViewById(R.id.img);
  2. // 创建链接
  3. String url = "图片链接";
  4. // 创建队列
  5. RequestQueue requestQueue = Volley.newRequestQueue(this);
  6. // 创建图片请求
  7. ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
  8. @Override
  9. public void onResponse(Bitmap response) {
  10. img.setImageBitmap(response);
  11. }
  12. }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
  13. @Override
  14. public void onErrorResponse(VolleyError error) {
  15. }
  16. });
  17. // 添加进队列
  18. requestQueue.add(imageRequest);

2、通过Imageloader加载图片

这种方法对比起上一种来说要更加复杂一些,我们需要先新建一个类实现ImageLoader.ImageCache接口

  1. public class BitmapCache implements ImageLoader.ImageCache{
  2. private LruCache<String, Bitmap> mCache;
  3. public BitmapCache() {
  4. //设置图片最大值
  5. int maxSize = 10*1024;
  6. mCache = new LruCache<String, Bitmap>(maxSize){
  7. @Override
  8. protected int sizeOf(String key, Bitmap value) {
  9. return value.getRowBytes()*value.getHeight();
  10. }
  11. };
  12. }
  13. @Override
  14. public Bitmap getBitmap(String url) {
  15. return mCache.get(url);
  16. }
  17. @Override
  18. public void putBitmap(String url, Bitmap bitmap) {
  19. mCache.put(url,bitmap);
  20. }
  21. }

然后再去MainActivity中去创建ImageLoader,它不需要我们去设置图片,只需要将图片作为一个参数传递进去,它会帮我们自动加载进ImageView中。

  1. img = (ImageView) findViewById(R.id.img);
  2. // 创建链接
  3. String url = "图片链接";
  4. // 创建队列
  5. RequestQueue requestQueue = Volley.newRequestQueue(this);
  6. // 创建图片请求
  7. ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
  8. // 设置图片加载监听,设置默认图片和加载错误图片
  9. ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
  10. // 发起请求
  11. imageLoader.get(url,imageListener);

3、通过NetworkImageView加载图片

除了使用ImageView加载图片,Volley还提供了一个组件就是NetworkImageView,我们在布局文件上使用它。

  1. <com.android.volley.toolbox.NetworkImageView
  2. android:id="@+id/img"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. </com.android.volley.toolbox.NetworkImageView>

它同样需要前面的BitmapCache类,因为他也需要ImageLoder。

  1. img = (NetworkImageView) findViewById(R.id.img);
  2. // 创建链接
  3. String url = "图片地址";
  4. // 创建队列
  5. RequestQueue requestQueue = Volley.newRequestQueue(this);
  6. // 创建一个ImageLoader
  7. ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
  8. // 默认图片和异常图片设置
  9. img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
  10. img.setErrorImageResId(R.drawable.ic_home_black_24dp);
  11. // 加载图片
  12. img.setImageUrl(url,imageLoader);

总结

不管你使用的是Volley框架是单纯的请求数据还是加载图片都要记住,它不适合体量较大的网络请求。

以上三种加载网络图片的方式最终都能得到成果图

原文链接:https://www.cnblogs.com/nhgtx/p/16918545.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号