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

对着背影说爱祢 提交于 2020-10-25 03:56:23

新建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

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!