0
点赞
收藏
分享

微信扫一扫

【39】kotlin 协程 异步下载图片2


新建package  basic

新建BaseCoroutines.kt

package com.yzdzy.kotlin.chapter7.basic

import cn.kotliner.coroutine.common.HttpError
import cn.kotliner.coroutine.common.HttpException
import cn.kotliner.coroutine.common.HttpService
import cn.kotliner.coroutine.common.log
import cn.kotliner.coroutine.ui.LOGO_URL
import java.lang.Exception
import javax.xml.ws.http.HTTPException
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlin.coroutines.startCoroutine
import kotlin.coroutines.suspendCoroutine

fun 我要开始协程了(block: suspend () -> Unit) {
block.startCoroutine(BaseCoroutines())
}

suspend fun 我要开始加载图片了(url: String) = suspendCoroutine<ByteArray> { 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.basic

import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext


class BaseCoroutines: Continuation<Unit> {
override val context: CoroutineContext
get() = EmptyCoroutineContext

override fun resumeWith(result: Result<Unit>) {
}

}

在刚才的common包中新建

Log.kt

package cn.kotliner.coroutine.common

import java.text.SimpleDateFormat
import 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.ui


import cn.kotliner.coroutine.common.HttpError
import cn.kotliner.coroutine.common.HttpService
import cn.kotliner.coroutine.common.log
import com.yzdzy.kotlin.chapter7.basic.我要开始加载图片了
import com.yzdzy.kotlin.chapter7.basic.我要开始协程了
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.HttpException
import retrofit2.Response
import javax.swing.JFrame.EXIT_ON_CLOSE
import 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<String>) {
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

这说明协程并非异步。下面我们要把他切换到异步

举报

相关推荐

0 条评论