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 - 没指定,就是在当前线程