Android Volley 基本使用

news2024/11/18 11:42:17

Android Volley 基本使用

本篇主要介绍 Google 给Android 平台提供的 Volley 一个 Http请求库 , 齐射!

1.概述

Volley是Google 提供的一个小巧的异步请求库,扩展很强支持okhttp,(默认是 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现), Volley 英文齐射的意思 就是指无数急促的请求,适合数据量小,并且通信频繁的场景

官方文档 https://google.github.io/volley/

image-20221223143616856

2.准备工作

想通过 volley 调用一个我自己的博客文章接口 然后展示标题 和 短描述 到 页面上

2.1 编写布局文件

上面展示标题 下面展示 短描述

image-20221224011336283

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/showTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textStyle="bold"
        android:textSize="25sp"
        android:textColor="@color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.2" />

    <TextView
        android:id="@+id/showShortDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/showTitle"
        app:layout_constraintVertical_bias="0.2" />


</androidx.constraintlayout.widget.ConstraintLayout>

2.2 提供博客接口地址

#随便找了我的一篇博客的 请求地址
https://www.askajohnny.com/blogs/blogInfo/303/15

2.3 通过JSON To Kotlin Class 插件生成 data class (kotlin)

和 IDEA 中 Json Formatter插件类似,它是生成JAVA的, 而这个 JSON To Kotlin Class 插件是用来生成kotlin 的数据类的

右击文件 Generate.. 或者 control + 回车 唤起转化窗口

image-20221223173306949

package com.johnny.volleydemo

data class BlogInfo(
    val code: Int,
    val `data`: Data,
    val msg: String
)

data class Data(
    val anchors: List<Anchor>,
    val blogContent: String,
    val blogImageUrl: String,
    val blogMdContent: String,
    val blogShortContent: String,
    val blogTitle: String,
    val blogTypeAnchor: Any,
    val blogTypeId: String,
    val blogTypeName: Any,
    val clickCount: Int,
    val createDate: String,
    val createMonth: Any,
    val createTime: String,
    val createUser: Any,
    val id: Int,
    val isThumbed: String,
    val nextBlogId: Any,
    val nextBlogTitle: Any,
    val previousBlogId: Any,
    val previousBlogTitle: Any,
    val thumbCount: Int,
    val updateTime: String
)

data class Anchor(
    val anchorId: String,
    val anchorName: String
)

3.引入依赖

根据你的dsl 语言 选择适合的方式引入依赖

Groovy

dependencies {
    implementation 'com.android.volley:volley:1.2.1'
}

Kotlin

dependencies {
    implementation("com.android.volley:volley:1.2.1")
}

4.发送请求

使用 volley 需要先构建一个请求, 并且把请求提交到 newRequestQueue 队列中, 提交后 volley 会根据构建的请求异步发送请求, 只需要在回调的地方处理请求的响应即可

4.1 StringRequest 构建请求

volley 提供了 StringRequest 构建请求

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val titleTextView = findViewById<TextView>(R.id.showTitle)
        val shortDescTextView = findViewById<TextView>(R.id.showShortDesc)

        //使用 volley需要创建一个Queue
        val requestQueue = Volley.newRequestQueue(this)
        //请求的 博客 url
        val url =
            "https://www.askajohnny.com/blogs/blogInfo/303/15"
        //构建StringRequest请求
        val stringRequest = StringRequest(Request.Method.GET,
            url, {
                //由于我后端没有在header 的 charset中返回 UTF-8 所以默认当做ISO-8859-1格式
                //所以这里需要先转化成 UTF-8
                val data = String(
                    it.toByteArray(Charsets.ISO_8859_1),
                    Charsets.UTF_8
                )
                Log.d(TAG, "onCreate: stringRequest  ${data}")
                //通过Gson转化 成上面生成的 数据类
                val blogInfo = Gson().fromJson(data, BlogInfo::class.java)
                //把后端返回的数据 展示在 textview上
                titleTextView.text = blogInfo.data.blogTitle
                shortDescTextView.text = blogInfo.data.blogShortContent
            }, {
                Log.d(TAG, "onCreate: stringRequest error ${it.message}")
            })
        //把请求推入 queue 会自动进行异步请求
        requestQueue.add(stringRequest)
    }

效果如下..

image-20221224012424698

4.2 JsonObjectRequest 构建请求

按照 JSONObject 获取数据

第二个参数 null 表示Get请求 第二个参数如果有设置 则是post方式

GET 请求

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val titleTextView = findViewById<TextView>(R.id.showTitle)
        val shortDescTextView = findViewById<TextView>(R.id.showShortDesc)

        //val url = "https://weather.api.bdymkt.com/day?city=无锡"
        //
        val requestQueue = Volley.newRequestQueue(this)
        val url =
            "https://www.askajohnny.com/blogs/blogInfo/303/15"
        val postRequest = object : JsonObjectRequest(url, null,
            {
                Log.d(TAG, "volleyInitData: request success $it")
                titleTextView.text = it.getJSONObject("data").get("blogTitle") as String?
                shortDescTextView.text = it.getJSONObject("data").get("blogShortContent") as String
            }, {
                Log.d(TAG, "volleyInitData: request error ${it.message}")
            }) {
            override fun getHeaders(): MutableMap<String, String> {
                val headers = mutableMapOf<String, String>()
                headers["Accept"] = "application/json"
                headers["Content-Type"] = "application/json; charset=UTF-8"
                return headers
            }
        }
        requestQueue.add(postRequest)
    }

POST请求

此时 第二个参数设置了JSONObject() 是 post方式

        val jsonObject = JSONObject()
        jsonObject.put("pageNumber", 0)
        jsonObject.put("pageSize", 20)
        val jsonArray = JSONArray()
        jsonObject.put("ids", jsonArray)
                //此时 第二个参数设置了 是 post方式 
        val postRequest = object : JsonObjectRequest(requestUrl, jsonObject, {
            Log.d(TAG, "volleyInitData: jsonstr:$it")
            val jsonStr = it.toString()
            val blogInfo = Gson().fromJson(jsonStr, BlogInfo::class.java)
            blogAdapter.list
                .addAll(blogInfo.data.content)
            blogAdapter.notifyDataSetChanged()
        }, {
            Log.d(TAG, "volleyInitData: request error ${it.message}")
        }) {
            override fun getHeaders(): MutableMap<String, String> {
                val headers = mutableMapOf<String, String>()
                headers["Accept"] = "application/json";
                headers["Content-Type"] = "application/json; charset=UTF-8";
                return headers
            }
        }

5. 扩展

5.1 添加 Header 和 Params

注意 需要object: 进行匿名内部类, 重写 getHeaders getParams getPriority 等等方法

//注意 需要object: 进行匿名内部类,  重写 getHeaders  getParams 方法
val stringRequest = object : StringRequest(Request.Method.GET,
    url, {
        val data = String(
            it.toByteArray(Charsets.ISO_8859_1),
            Charsets.UTF_8
        )
        Log.d(TAG, "onCreate: stringRequest  ${data}")
        val blogInfo = Gson().fromJson(data, BlogInfo::class.java)
        titleTextView.text = blogInfo.data.blogTitle
        shortDescTextView.text = blogInfo.data.blogShortContent
    }, {
        Log.d(TAG, "onCreate: stringRequest error ${it.message}")
    }) { //最后面 大括号 里面是匿名内部类重新方法
    override fun getHeaders(): MutableMap<String, String> {
        //返回 map map里面添加 需要放入Header的数据
        return super.getHeaders()
    }

    override fun getParams(): MutableMap<String, String>? {
        //返回 map map里面添加 需要添加的 query params
        return super.getParams()
    }
     //指定 优先级
     override fun getPriority(): Priority {
        return Priority.HIGH
     }
}

5.2 取消队列中的请求

如果想把队列中的请求取消 , 需要给请求设置一个 tag , 然后调用队列的 cancelAll 可以把指定tag的请求取消了

 //...

 stringRequest.setTag("obj");
 queue.add(objRequest);
        //取消请求
 queue.cancelAll("obj");

总结

本篇主要介绍 andriod 中 Volley的基本使用方式,它是官方开发的一个HTTP框架 简化操作 , Volley 的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕

乱码问题参考:

https://blog.csdn.net/yangbiyao/article/details/51270839

欢迎大家访问 个人博客 Johnny小屋
欢迎关注个人公众号

欢迎关注个人公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<<数据结构>>向上调整建堆和向下调整建堆的分析(特殊情况,时间复杂度分析,两种建堆方法对比,动图)

今天&#xff0c;我来讲讲建堆算法中使用向上调整和向下调整。 目录建堆的应用向上调整建堆向下调整建堆向下调整建堆和向上调整建堆的选择建堆的应用 在数据结构模拟堆中&#xff0c;我们可能会通过输入数组的元素来进行建堆或者在堆排序中&#xff0c;我们也需要建堆&#x…

Kubernetes之网络排查详细文

文章目录前言一、Pod 网络异常1.1 网络异常大概分为如下几类&#xff1a;1.2 那么整个 Pod 网络异常分类可以如下图所示&#xff1a;二、常用网络排查工具2.1 tcpdump2.1.1 抓取示例2.1.2 选项分组2.1.3 过滤 TCP 标记位2.1.4 查找 http 包2.1.5 查找 DNS 流量2.1.6 查找对应流…

财务数字化在企业数字化转型中起到什么作用?

财务数字化在企业数字化转型中起到什么作用&#xff1f;许多企业在推动各大业务部门进行数字化转型时&#xff0c;往往会忽略财务部门。然而&#xff0c;作为掌握公司核心资源与数据和推动企业数字化建设的部门&#xff0c;财务也应成为企业数字化转型的重要突破口。 这篇就用…

Unity 之 Addressable可寻址系统 -- 可寻址系统使用介绍 -- 入门(三)

可寻址系统设置面板使用介绍介绍 -- 入门&#xff08;三&#xff09;一&#xff0c;可寻址系统目录介绍二&#xff0c;可寻址系统面板介绍2.1 Groups - 资源组2.2 Settings - 设置2.3 Profiles - 配置文件2.4 Event Viewer - 事件查看器2.5 Analyze - 分析工具2.6 Hosting - 托…

sklearn GridSearchCV网格搜索和SVM的两个参数 C 和 gamma

GridSearchCV&#xff0c;它存在的意义就是自动调参&#xff0c;只要把参数输进去&#xff0c;就能给出最优化的结果和参数。GridSearchCV用于系统地遍历多种参数组合&#xff0c;通过交叉验证确定最佳效果参数。 引用自&#xff1a;公众号&#xff1a; 写bug的程旭源 个人博客…

学生信息管理系统【JDBC+JS+MYSQL+HTML+JSP+Servlet】(一)

第一次发综合项目&#xff0c;无论是前端还是后端&#xff0c;都应用到了&#xff0c;项目写的很完整&#xff0c;我将分为四篇文章把项目代码写完&#xff0c;多多支持 一&#xff1a;项目背景 学生成绩管理系统是基于互联网的信息管理平台&#xff0c;主要提供成绩录入和查…

黄金的几种征兆

有别于股票、基金等的投资品种&#xff0c;由于现货黄金采用保证金的交易制度&#xff0c;因而使投资者有爆仓的可能。具体而言&#xff0c;爆仓是指在某些特殊条件下&#xff0c;投资者保证金账户中的客户权益变为负值的情形。在黄金交易的实战中&#xff0c;客户爆仓大多与资…

一文搞懂Spring,堪称Spring源码终结者

Spring的影响力想必无需与大家多说&#xff0c;如果你用spring&#xff0c;那么读读源码有助于对你最重要的工具的理解&#xff0c;好的框架源码也可以帮助我们理解什么是好代码。 刚参加工作那会&#xff0c;没想过去读源码&#xff0c;更没想过去改框架的源码&#xff1b;甚…

反序列化渗透与攻防(一)之PHP反序列化漏洞

前言 序列化和反序列化几乎是工程师们每天都要面对的事情&#xff0c;但是要精确掌握这两个概念并不容易&#xff1a;一方面&#xff0c;它们往往作为框架的一部分出现而湮没在框架之中&#xff1b;另一方面&#xff0c;它们会以其他更容易理解的概念出现&#xff0c;例如加密、…

干货 | 涉疫数据的安全应用方案

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;涉疫数据分类及问题剖析一、涉疫数据分类我们以新冠肺炎疫情为例&#xff0c;构建数据图谱&#xff0c;将涉疫数据分为三个大类&#xff0c;八个小类&#xff0c;共分为50项…

数字化营销,为何网站如此重要?

无论你在哪个行业&#xff0c;客户都会期望你有一个网站。没有网站的公司会发出信息&#xff0c;说他们已经停止运营&#xff0c;或者更糟的是&#xff0c;他们与客户失去了直接的联系。 通常企业的自有媒体由您的网站和社交媒体帐户组成。媒体付费广告等赢利媒体的数据不在您的…

你想要的100套HTML模板

好/看/的/网/页/这/都/有/ 目录 01 HTML 02 效果显示 03 文件演示 04 获取文件 源码链接 获取源码&#xff1f;私信&#xff1f;关注&#xff1f;点赞&#xff1f;收藏&#xff1f; 网页设计 Web design 2023/01/12 “Creativity is allowing yourself to make mista…

岁末年初再添佳誉丨Kyligence 荣获多个奖项及榜单认可

过去的一年&#xff0c;Kyligence 持续创新和打磨企业级产品&#xff0c;以全球领先的指标中台及多维数据库产品在金融、零售、制造、医疗等多个行业场景中逐步落地&#xff0c;实现数智化管理与业务的深度融合。岁末年初&#xff0c;Kyligence 再添佳誉&#xff0c;技术产品、…

第二章.线性回归以及非线性回归—多元线性回归

第二章.线性回归以及非线性回归 2.6 多元线性回归 1.特征&#xff1a; 1).单特征&#xff1a; 2).多特征&#xff1a; 有多少个特征就有多少个未知数x 2.多元线性回归模型的使用场景&#xff1a; 当Y值的影响因素不是唯一时&#xff0c;采用多元线性回归。 3.梯度下降法求解…

【自然语言处理】【chatGPT系列】大语言模型可以自我改进

大语言模型可以自我改进《Large Language Models Can Self-Improve》论文地址&#xff1a;https://arxiv.org/pdf/2210.11610.pdf 相关博客 【自然语言处理】【chatGPT系列】大语言模型可以自我改进 【自然语言处理】【ChatGPT系列】WebGPT&#xff1a;基于人类反馈的浏览器辅助…

python 波士顿房价预测

数据集地址&#xff1a;Index of /ml/machine-learning-databases/housing (uci.edu) 数据集中共有506条样本数据&#xff0c;每条样本包含了13个影响房价的特征。 数据集格式 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 2…

openlayers浅入(了解框架逻辑以及简单使用)

openlayers浅入&#xff08;了解框架逻辑以及简单使用&#xff09; 项目需求&#xff0c;使用openlayers替换天地图api开发&#xff0c;记录openlayer的使用 简介 OpenLayers是一个用于开发WebGIS客户端的JavaScript包&#xff0c;最初基于BSD许可发行。OpenLayers是一个开源的…

1575_AURIX_TC275_MTU简介以及部分寄存器

全部学习汇总&#xff1a; GitHub - GreyZhang/g_TC275: happy hacking for TC275! 从今天开始看一个全新的模块介绍MTU&#xff0c;存储测试单元。 TC275中所有的ECC、内置测试以及存储冗余等都有一个统一的接口规范。MTU负责管理所有的存储测试功能。MTU主要有两套寄存器&am…

【iOS】系统框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言熟悉系统框架多用块枚举&#xff0c;少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式对自定义其内存管理语义的collection使…

Wechaty API 方法 文档整理

背景&#xff1a;刚使用wechaty的时候&#xff0c;对一个不熟悉初学者来说&#xff0c;看官方文档比较费时间&#xff0c;所以把方法和描述集合在一张表上&#xff0c;再使用的时候找对应的方法会比较直观。 中文文档&#xff1a; 介绍 - Wechatyhttps://wechaty.gitbook.io/…