kotlin的协程在网络请求方面的应用

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: GET代表希望从服务器那里获取数据,POST则代表向服务器提交数据

一、利用Http访问网络

GET代表希望从服务器那里获取数据

POST则代表向服务器提交数据

网络请求一般在子线程中执行,不然可能会阻塞主线程导致界面卡死

利用okHttp开源库进行简化原生的HttpURLConnection

二、解析网络上常见的两种数据

这里面测试可以用自己的云服务器也可以用apache或者nginx搭建本地服务器,不过原理都是一样的

1.xml格式

Pull解析和Sax解析,这里不打算贴源码,太长了,但理解起来不算太难,要注意以下的一个点

从Android9.0开始,不允许http明文传输数据,必须使用https传输,所以,测试没有https的话,可以添加

以下内容去配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted = "true">
        <trust-anchors>
            <certificates src = "system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

最后还要再AndroidManifest上添加配置文件

android:networkSecurityConfig = "@xml/network_config">

2.json格式

可以使用官方原生的JSONObject与JSONAarry进行解析数据

[{"id":20,"name":"dd"},{"id":30,"name":"ddl"}]
[]代表一个JSONAarry
{}代表一个JSONObject
//JSONObject对象中的具体的字段需要用get等方法进行提取数据

最后google官方提供了一个面向对象的解析方法,GSON库,使得我们可以利用面向对象的方法轻松提取数据

//解析单个JSONObject{"id":20,"name":"dd"}
//字段相当于一个javabean类似的做法转化成类
//例如
class Person(val name:String,val id:Int)
//然后调用
val gson = Gson()
val person = gson.fromJson(jsonData,Person::class.java)
//然后这里的person就是一个person对象

//解析数组相对麻烦一点,不过也挺简单的
val typeOf = object:TypeToken<List<Person>>(){}.type
val people = gson.fromJson<List<Person>>(jsonData,typeOf)
//这里的people是一个list对象

最后这里提及一下回调操作,主要是为了简化网络请求的方式,抽象出一些重复性操作,使得代码更加简洁

三、Retrofit的使用

允许我们将接口分类使得代码的架构更加合理,有指定根路径使得我们只需要利用相对路径即可发起请求

这里举一些处理复杂接口的一些例子

//最简单的获取数据的一个接口文件,静态
//GET https://ex.com/get_data.json
@GET("get_data.json")
fun getAppData(): Call<List<App>>

//数据前面有可变参数,采用占位符,然后再指定类型
//GET https://ex.com/<page>/get_data.json
@GET("{page}/get_data.json")
fun getAppData(@Path("page")page:Int):Call<List<App>>

//服务器要求传入一些参数
//GET https://ex.com/get_data.json ?u = <user> & t = <token>
@GET("get_data.json")
fun getData(@Query("u") user:String,@Query("t") token:String):Call<List<App>>

//要求删除数据
//DELETE https://ex.com/data/<id>
@DELETE("data/{id}")
fun deleteData(@Path("id")id :String):Call<ResponseBody>

//提交数据
//POST https://ex.com/data/create
@POST("data/create")
fun createData(@Body data:App):Call<ResponseBody>

//请求header中的指定参数
//GET https://ex.com/get_data.json User-Agent:okhttp Cache-Control:max-age = 0 
    //静态
@Headers("User-Agent:okhttp","Cache-Control:max-age = 0")
@GET("get_data.json")
fun getData():Call<List<App>>
    //动态
@GET("get_data.json")
fun getData(@Header("User-Agent") userAgent:String,@Header("Cache-Control") cacheControl:String):Call<List<App>>

四:Kotlin:协程

用于解决高并发的一个新的方案,协程和线程有点像,不过协程是在代码层面实现的线程,故拥有更加良好的性能,以下解释几个名词

能力有限归纳不了太多

并发:即同一时间大量操作,宏观表现为并行,比如淘宝秒杀的时候,大家鼠标点击秒杀的时候就是并行,如果只是单纯的开启线程实现并行的话,可能会直接奔溃,kotlin这里提供了一个更加轻量的协程就是解决此问题

顶层协程:应用结束,协程也随之结束

协程作用域:顾名思义就是在里面的代码可以执行协程操作

挂起:就是不执行操作的意思

总之协程的出现大大降低处理并发编程的难度,不过由于初学没来得及应用,只能理解这些理论层面的

目录
相关文章
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的自适应神经网络:原理与应用
【8月更文挑战第14天】在深度学习领域,自适应神经网络作为一种新兴技术,正逐渐改变我们处理数据和解决问题的方式。这种网络通过动态调整其结构和参数来适应输入数据的分布和特征,从而在无需人工干预的情况下实现最优性能。本文将深入探讨自适应神经网络的工作原理、关键技术及其在多个领域的实际应用,旨在为读者提供一个全面的视角,理解这一技术如何推动深度学习向更高效、更智能的方向发展。
|
4天前
|
存储 安全 网络安全
信息安全:网络安全审计技术原理与应用.
信息安全:网络安全审计技术原理与应用.
17 4
|
3天前
|
机器学习/深度学习 编解码 人工智能
【生成式对抗网络】GANs在数据生成、艺术创作,以及在增强现实和虚拟现实中的应用
生成对抗网络(Generative Adversarial Networks, GANs)在数据生成领域具有显著的应用价值。GANs通过生成器(Generator)和判别器(Discriminator)两个相互竞争的神经网络,不断迭代优化,从而生成高质量的数据样本。这一技术在数据增强方面尤为重要,特别是在数据稀缺或难以获取的领域,如医疗影像分析、自动驾驶等。GANs能够生成与真实数据相似的新数据样本,从而扩充数据集规模,提高模型的泛化能力。此外,GANs还可以用于生成仿真数据,如金融领域中的股票价格走势,用于训练预测模型,提高预测准确性
11 2
|
4天前
|
安全 关系型数据库 网络安全
信息安全:网络安全漏洞防护技术原理与应用.
信息安全:网络安全漏洞防护技术原理与应用.
17 3
|
8天前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
28 4
|
18天前
|
XML Android开发 数据格式
Android实战经验之Kotlin中快速实现动态更改应用图标和名称
本文介绍在Android中通过设置多个活动别名动态更改应用图标和名称的方法,涉及XML配置及Kotlin代码示例。
58 10
|
11天前
|
达摩院 供应链 JavaScript
网络流问题--仓储物流调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文通过使用MindOpt工具优化仓储物流调度问题,旨在提高物流效率并降低成本。首先,通过考虑供需匹配、运输时间与距离、车辆容量、仓库储存能力等因素构建案例场景。接着,利用数学规划方法,包括线性规划和网络流问题,来建立模型。在网络流问题中,通过定义节点(资源)和边(资源间的关系),确保流量守恒和容量限制条件下找到最优解。文中还详细介绍了MindOpt Studio云建模平台和MindOpt APL建模语言的应用,并通过实例展示了如何声明集合、参数、变量、目标函数及约束条件,并最终解析了求解结果。通过这些步骤,实现了在满足各仓库需求的同时最小化运输成本的目标。
|
16天前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
30 5
|
15天前
|
存储 Java Kotlin
Kotlin 布尔值教程:深入理解与应用示例
Kotlin中的布尔值是一种数据类型,仅能存储`true`或`false`两种状态,适用于表示二选一的情况,如开关或真假判断。布尔类型可通过`Boolean`关键字声明,并直接赋值为`true`或`false`。此外,Kotlin支持使用比较运算符创建布尔表达式,用于条件判断。条件语句包括`if`、`else`和`else if`,允许根据不同条件执行特定代码块。特别地,在Kotlin中,`if..else`结构不仅能作为语句使用,还能作为表达式,即可以在条件判断的同时返回一个值。这种灵活性使得Kotlin在处理条件逻辑时更为简洁高效。
26 1
|
18天前
|
安全 Java Android开发
Kotlin字符串秘籍:解锁高效处理与创意应用,让你的代码闪耀不凡!
【8月更文挑战第2天】Kotlin是一门现代化的静态类型语言,以简洁、安全及强互操作性著称,在Android及服务器端开发中广受好评。本文通过与其他语言对比,深入解析Kotlin中字符串的基础和高级用法。Kotlin简化了字符串拼接,支持直接使用`+`操作符,并引入了直观的字符串模板。它提供了丰富的字符串操作函数,如使用索引范围进行子字符串提取,增强了代码的可读性。Kotlin字符串的不可变性提升了程序稳定性。利用扩展函数特性,可以轻松定制字符串行为,提高代码的模块化和重用性。掌握这些技巧能显著提升开发效率和代码质量。
22 1