day10:kotlin的协程已经安卓网络技术初步

Posted wresource

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day10:kotlin的协程已经安卓网络技术初步相关的知识,希望对你有一定的参考价值。

一、利用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这里提供了一个更加轻量的协程就是解决此问题

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

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

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

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

以上是关于day10:kotlin的协程已经安卓网络技术初步的主要内容,如果未能解决你的问题,请参考以下文章

为什么我放弃使用 Kotlin 中的协程?

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

Kotlin 取出来最快的协程数据

译文kotlin1.3 版本的协程

译文kotlin1.3 版本的协程