本文共 3091 字,大约阅读时间需要 10 分钟。
新建package basic
新建BaseCoroutines.kt
package com.yzdzy.kotlin.chapter7.basicimport cn.kotliner.coroutine.common.HttpErrorimport cn.kotliner.coroutine.common.HttpExceptionimport cn.kotliner.coroutine.common.HttpServiceimport cn.kotliner.coroutine.common.logimport cn.kotliner.coroutine.ui.LOGO_URLimport java.lang.Exceptionimport javax.xml.ws.http.HTTPExceptionimport kotlin.coroutines.resumeimport kotlin.coroutines.resumeWithExceptionimport kotlin.coroutines.startCoroutineimport kotlin.coroutines.suspendCoroutinefun 我要开始协程了(block: suspend () -> Unit) { block.startCoroutine(BaseCoroutines())}suspend fun 我要开始加载图片了(url: String) = suspendCoroutine{ continuation -> log("耗时下载图片") try { val reponseBody = HttpService.service.getLogo(LOGO_URL).execute() if (reponseBody.isSuccessful) { reponseBody.body()?.byteStream()?.readBytes()?.let(continuation::resume) }else{ continuation.resumeWithException(HttpException(reponseBody.code())) } }catch (e:Exception){ continuation.resumeWithException(e) }}
新建 Corutines.kt
package com.yzdzy.kotlin.chapter7.basicimport kotlin.coroutines.Continuationimport kotlin.coroutines.CoroutineContextimport kotlin.coroutines.EmptyCoroutineContextclass BaseCoroutines: Continuation{ override val context: CoroutineContext get() = EmptyCoroutineContext override fun resumeWith(result: Result ) { }}
在刚才的common包中新建
Log.kt
package cn.kotliner.coroutine.commonimport java.text.SimpleDateFormatimport java.util.*/** * Created by benny on 5/20/17. */val dateFormat = SimpleDateFormat("HH:mm:ss:SSS")val now = { dateFormat.format(Date(System.currentTimeMillis()))}fun log(msg: String) = println("${now()} [${Thread.currentThread().name}] $msg")
新建 Https.kt 为了抛异常使用
package cn.kotliner.coroutine.common/** * Created by benny on 5/20/17. */object HttpError{ const val HTTP_ERROR_NO_DATA = 999 const val HTTP_ERROR_UNKNOWN = 998}data class HttpException(val code: Int): Exception()
修改MainKt.kt
package cn.kotliner.coroutine.uiimport cn.kotliner.coroutine.common.HttpErrorimport cn.kotliner.coroutine.common.HttpServiceimport cn.kotliner.coroutine.common.logimport com.yzdzy.kotlin.chapter7.basic.我要开始加载图片了import com.yzdzy.kotlin.chapter7.basic.我要开始协程了import okhttp3.ResponseBodyimport retrofit2.Callimport retrofit2.Callbackimport retrofit2.HttpExceptionimport retrofit2.Responseimport javax.swing.JFrame.EXIT_ON_CLOSEimport javax.swing.SwingUtilities/** * Created by benny on 5/20/17. */const val LOGO_URL = "http://www.imooc.com/static/img/index/logo.png?t=1.1"fun main(args: Array) { val frame = MainWindow() frame.title = "Coroutine@Bennyhuo" frame.setSize(200, 150) frame.isResizable = true frame.defaultCloseOperation = EXIT_ON_CLOSE frame.init() frame.isVisible = true frame.onButtonClick { log("协程之前") 我要开始协程了 { log("协程开始") val imageDate = 我要开始加载图片了(LOGO_URL) log("拿到图片") frame.setLogo(imageDate) } log("协程之后") }}
查看logo
这说明协程并非异步。下面我们要把他切换到异步
转载地址:http://hosr.baihongyu.com/