Code For Better 谷歌开发者之声——Android 中的 Volley 库

简介: Volley是一个HTTP 库,它使 Android 应用程序的网络变得非常简单和快速。它由 Google 开发并在 2013 年 Google I/O 期间推出。它的开发是因为 Android SDK 中缺少能够在不影响用户体验的情况下工作的网络类。尽管 Volley 是 Android 开源项目 (AOSP) 的一部分,但 Google 在 2017 年 1 月宣布 Volley 将迁移到一个独立的库。它管理网络请求的处理和缓存,并节省开发人员一次又一次编写相同的网络调用/缓存代码的宝贵时间。Volley不适合大型下载或流式操作,因为 Volley 在解析期间将所有响应保存在内存中。

Volley是一个HTTP 库,它使 Android 应用程序的网络变得非常简单和快速。它由 Google 开发并在 2013 年 Google I/O 期间推出。它的开发是因为 Android SDK 中缺少能够在不影响用户体验的情况下工作的网络类。尽管 Volley 是 Android 开源项目 (AOSP) 的一部分,但 Google 在 2017 年 1 月宣布 Volley 将迁移到一个独立的库。它管理网络请求的处理和缓存,并节省开发人员一次又一次编写相同的网络调用/缓存代码的宝贵时间。Volley不适合大型下载或流式操作,因为 Volley 在解析期间将所有响应保存在内存中。

Volley 的特点

1.请求排队和优先级

2.有效的请求缓存和内存管理

3.库的可扩展性和定制化以满足我们的需求

4.取消请求

使用 Volley 的优势

1.所有需要在 Android 中使用 Networking 完成的任务,都可以在 Volley 的帮助下完成。

2.网络请求的自动调度。

3.捕捉。

4.多个并发网络连接。

5.取消请求 API。

6.请求优先级。

7.Volley 提供调试和跟踪工具。

如何导入 Volley 并添加权限

在开始使用 Volley 之前,需要在 Android 项目中导入 Volley 并添加权限。这样做的步骤如下:

创建一个新项目。打开build.gradle(Module: app)并添加以下依赖项:

dependencies{ 
    //...
    implementation 'com.android.volley:volley:1.0.0'
}

AndroidManifest.xml添加互联网权限:

<uses-permission android:name="android.permission.INTERNET" />

Volley Library 中的类别

Volley 有两个主要类别:

1.请求队列:将请求分发到网络时使用的兴趣。如果需要,可以根据需要创建一个请求队列,但通常它是在启动时的早期创建的,并保留它并将其用作 Singleton。

2.请求:进行 Web API 调用的所有必要信息都存储在其中。它是创建网络请求(GET、POST)的基础。

使用 Volley 库的请求类型

字符串请求

String url = "https:// string_url/";
StringRequest
  stringRequest
  = new StringRequest(
    Request.Method.GET,
    url,
    new Response.Listener() {
      @Override
      public void onResponse(String response)
      {
      }
    },
    new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error)
      {
      }
    });
requestQueue.add(stringRequest);
</pre>

JSON对象请求

String url = "https:// json_url/";
JsonObjectRequest
  jsonObjectRequest
  = new JsonObjectRequest(
    Request.Method.GET,
    url,
    null,
    new Response.Listener() {
      @Override
      public void onResponse(JSONObject response)
      {
      }
    },
    new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error)
      {
      }
    });
requestQueue.add(jsonObjectRequest);

JSONArray 请求

JsonArrayRequest
  jsonArrayRequest
  = new JsonArrayRequest(
    Request.Method.GET,
    url,
    null,
    new Response.Listener() {
      @Override
      public void onResponse(JSONArray response)
      {
      }
    },
    new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error)
      {
      }
    });
requestQueue.add(jsonArrayRequest);

图片请求

int max - width = ...;
int max_height = ...;
String URL = "http:// image_url.png";
ImageRequest
  imageRequest
  = new ImageRequest(URL,
          new Response.Listener() {
            @Override
            public void
            onResponse(Bitmap response)
            {
              // Assign the response
              // to an ImageView
              ImageView
                imageView
                = (ImageView)
                  findViewById(
                    R.id.imageView);
              imageView.setImageBitmap(response);
            }
          },
          max_width, max_height, null);
requestQueue.add(imageRequest);

添加帖子参数

String tag_json_obj = "json_obj_req";
String
  url
  = "https:// api.xyz.info/volley/person_object.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...PLease wait");
pDialog.show();
JsonObjectRequest
  jsonObjReq
  = new JsonObjectRequest(
    Method.POST,
    url,
    null,
    new Response.Listener() {
      @Override
      public void onResponse(JSONObject response)
      {
        Log.d(TAG, response.toString());
        pDialog.hide();
      }
    },
    new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error)
      {
        VolleyLog.d(TAG, "Error: "
                  + error.getMessage());
        pDialog.hide();
      }
    }) {
    @Override
    protected Map getParams()
    {
      Map params = new HashMap();
      params.put("name", "Androidhive");
      params.put("email", "abc@androidhive.info");
      params.put("password", "password123");
      return params;
    }
  };
AppController.getInstance()
  .addToRequestQueue(jsonObjReq, tag_json_obj);

添加请求标头

String tag_json_obj = "json_obj_req";
String
  url
  = "https:// api.androidhive.info/volley/person_object.json";
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
JsonObjectRequest
  jsonObjReq
  = new JsonObjectRequest(
    Method.POST,
    url,
    null,
    new Response.Listener() {
      @Override
      public void onResponse(JSONObject response)
      {
        Log.d(TAG, response.toString());
        pDialog.hide();
      }
    },
    new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error)
      {
        VolleyLog.d(TAG, "Error: "
                  + error.getMessage());
        pDialog.hide();
      }
    }) {
    @Override
    public Map getHeaders() throws AuthFailureError
    {
      HashMap headers = new HashMap();
      headers.put("Content-Type", "application/json");
      headers.put("apiKey", "xxxxxxxxxxxxxxx");
      return headers;
    }
  };
AppController.getInstance()
  .addToRequestQueue(jsonObjReq, tag_json_obj);

处理 Volley 缓存

// 从缓存加载请求
Cache
  cache
  = AppController.getInstance()
    .getRequestQueue()
    .getCache();
Entry entry = cache.get(url);
if (entry != null) {
  try {
    String
      data
      = new String(entry.data, "UTF-8");
    // 处理数据,例如将其转换为 xml、json、位图等,
  }
  catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  }
}
}
else
{
  // 如果缓存的响应不存在
}
// 使缓存无效
AppController.getInstance()
  .getRequestQueue()
  .getCache()
  .invalidate(url, true);
// 关闭缓存字符串请求
StringRequest
  stringReq
  = new StringRequest(....);
// 禁用缓存
stringReq.setShouldCache(false);
// 删除特定缓存的缓存</strong>
AppController.getInstance()
  .getRequestQueue()
  .getCache()
  .remove(url);
// 删除所有缓存
AppController.getInstance()
  .getRequestQueue()
  .getCache()
  .clear(url);

取消请求

// 取消单个请求
String tag_json_arry = "json_req";
ApplicationController.getInstance()
  .getRequestQueue()
  .cancelAll("feed_request");
// 取消所有请求
ApplicationController.getInstance()
  .getRequestQueue()
  .cancelAll();

请求优先级

private Priority priority = Priority.HIGH;
StringRequest
  strReq
  = new StringRequest(
    Method.GET,
    Const.URL_STRING_REQ,
    new Response
      .Listener() {
          @Override
          public void onResponse(String response) {
            Log.d(TAG, response.toString());
            msgResponse.setText(response.toString());
            hideProgressDialog();
          } },
    new Response
      .ErrorListener() {
          @Override
          public void
          onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG,
                  "Error: "
                    + error.getMessage());
            hideProgressDialog();
          } }) {
    @Override
    public Priority getPriority()
    {
      return priority;
    }
  };
目录
相关文章
|
2月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
74 3
|
24天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
1月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
47 0
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
33 1
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
114 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
2月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
3月前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
427 3
|
3月前
|
IDE Java Android开发
安卓与iOS开发环境的差异及其对开发者的影响
在数字时代的浪潮中,移动应用成为人们生活的延伸。两大操作系统——安卓与iOS,如同两座技术高峰,各自占据着半壁江山。本文将探索这两个平台的开发环境差异,并讨论这些差异如何塑造开发者的编程习惯与职业选择。我们将从工具和语言、用户界面设计、系统架构、市场定位以及开发社区和资源五个方面进行比较,旨在为开发者提供一份实用的指南,帮助他们在不断变化的技术世界中,找到适合自己的发展路径。
58 3
|
3月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
87 0