• 需求分析
  • 效果展示
  • Coding

需求分析

怎样让普通函数适配协程,成为“实在的挂起函数”。即让调用方以同步的方法拿到异步使命回来效果

//场景描绘
fun getConfigContent(){
parseAssetsFile("config.json"){fileContent->
println(fileCapproveontent)
}
}
//CoroutineScene4.kt
fun parseAssetsFile(fileName:String,callback(Strjsoning)->Unit){
Thread(Runnable {
//readfile(fgitlabilename)  
Thread.sleep(2000)
callback("assets file contgithub永久回家地址ent")
}jsonp).start()
}
}

计划一

lifecycleScope.launch{
val fileContent =   lifecycleScope.async{parseAssetsFile()}.await()
//delay()
println(fileContent)
}
suspend parseAssetsFile(fileName:String):String{
return "assets file content"
}

计划二

lifecycleScope.launchjson是什么意思{
vgithub下载al fileContent = parseAssetsFile()
println(fgithub是干什么的ileContent)
}
suspengithub怎样下载文件d parseAssetsFile(fileName:String):String{
//susgiti轮胎pendCoroutine
return suspendCancellableCoroutine { continuation -&ggithub永久回家地址t;
Thread{
//io ....
contigithub开放私库nuation.resumeWigithub打不开th(Result.success("assets file content"application))
}.start()
}
}
public suspend fun delay(tgitlabimeMillis: Long) {
return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
cont.context.delagithub是干什么的y.scheduleResumeAfterDelay(timeMillis, cont)
}
}

一个比方

/**
*
* @Author:      jarrysong
*github永久回家地址 @CreateDate:  2021/4/8 0:24
* @Descriptjson是什么意思ion: 演示以异步的json文件是干什么的方法,读取assets目录下的文件github是干什么的,并且适配协程的写法,appearance让他实在的挂起函数
*
* 便利调用,直接以同步的方式拿到回来值
* @Version:
*/
object CoroutineScene3 {
private const val TAG = "CoroutineScene3"
suspend fun parseAssetFile(assManager:AssetManager,filegithub中文社区Name:String):Stgithub直播渠道永久回家ring{
return suspendCancellableCoroutine { continuation ->
Thread(Runnable{
val injson解析putStream = assManager.open(fileName)
val br = BufferedRgithub怎样下载文件eader(IjsonnputStreamReader(inputStappearream))
var line:String?
var stringBuilder = StringBuffer()
dgithub下载o{
line = br.readLine();
if(line != null) stringBuilder.append(line) else break
}whilegithub打不开 (true)
inputStream.close()
br.close()
Thread.sleep(2000)
Log.i(TAG,"parseassegithub官网tsfile completed")
contigithub永久回家地址nuation.resumeWith(Result.success(stringBuilder.toString()))
}).start()
}
}
}

调用

 lifecycleScope.launch {
val content = CoroutineScene3.parseAssetFile(assets ,"file.json")
Log.i(TAG,content)
}
Log.i(TAG,"start")

留意:

在Activity中建议用lifecycleScope.launch来发起协程,会跟apple着Activity的生命周期主动销app装置下载毁协程。

假如用GlobalScope.launch来发起,生命周期是Application,会导致内存走漏。

Kotlin(十)Kotlin协程使用

Retrofit怎样适配协程

参看:github.com/square/retr…

Kotlin(十)Kotlin协程使用