一、利用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这里提供了一个更加轻量的协程就是解决此问题
顶层协程:应用结束,协程也随之结束
协程作用域:顾名思义就是在里面的代码可以执行协程操作
挂起:就是不执行操作的意思
总之协程的出现大大降低处理并发编程的难度,不过由于初学没来得及应用,只能理解这些理论层面的