網路技術
- 一、利用Http訪問網路
- 二、決議網路上常見的兩種資料
- 1.xml格式
- 2.json格式
- 三、Retrofit的使用
- 四: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這里提供了一個更加輕量的協程就是解決此問題
頂層協程:應用結束,協程也隨之結束
協程作用域:顧名思義就是在里面的代碼可以執行協程操作
掛起:就是不執行操作的意思
總之協程的出現大大降低處理并發編程的難度,不過由于初學沒來得及應用,只能理解這些理論層面的
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/291336.html
標籤:其他
上一篇:Android集成華為推送教程
下一篇:Error:Module ‘app‘:platform ‘Google lnc.:Google APIs:22‘ not found.
