kotlin出來也已經有好長一段時間了,作爲google官方指定唯一親兒子,作爲Android開發也有必要去了解一下。(真的學不動了T.T)
作爲kotlin區別去java的獨有特性---協程,在很多Android開發工程師剛接觸kotlin時往往都是一頭霧水,畢竟協程的使用區別於我們習慣採用的handler,AsyncTask,rxjava。網上的教程有很多,我這兩天看也是十分掙扎,看了兩天終於整理出來一點頭緒,在這裏分享給大家。
在看這篇文章之前,請先瀏覽一遍這篇文章
https://www.jianshu.com/p/76d2f47b900d
這篇文章是我這兩天看下來比較能夠理解的文章,裏面的例子雖然是主要針對java的,但也建議手打一遍,幫助學習
進入正題,對於協程,我們可以理解成爲是幫助我們處理在主線程不能做的耗時操作的工具,在一定條件下,他的運行效率會比AsyncTask,Handler要高,他的優勢在於會合理的分配資源,避免了線程之間相互搶佔cpu資源的情況。
第一種方法
使用anko庫的doAsync方法,可以理解成我們原來使用的AsyncTask
doAsync {
val str: String = URL("https://www.wanandroid.com/banner/json").readText();
val response: BannerResponse = Gson().fromJson(str, BannerResponse::class.java)
//相當於RunInUiThread
uiThread { toast(response.toString()) }
}
第二種方法
使用withContent
fun doNet(){
//第二種 withContext
MainScope().launch {
getNetData()
}
}
private suspend fun getNetData() {
var json = withContext(Dispatchers.IO) {
val str: String = URL("https://www.wanandroid.com/banner/json").readText()
//runOnUiThread 直接輸出結果
// runOnUiThread() { toast(str) }
return@withContext str
}
//輸出結果 主線程toast
toast(json)
}
第三種
使用async
//第三種
MainScope().launch {
var result = async(Dispatchers.IO) {
var s = URL("https://www.wanandroid.com/banner/json").readText()
return@async s
}
toast(result.await())
}
當然,網絡請求肯定不止這幾種方法,以上列出的這些,還可以排列組合成其他的循序,同時也肯定有其他的方法,這裏我只是拋個磚,最後貼上一張關於DIspatcher圖
- Dispatchers.Default
- Dispatchers.IO -
- Dispatchers.Main - 主線程
- Dispatchers.Unconfined - 沒指定,就是在當前線程