博客
关于我
【39】kotlin 协程 异步下载图片2
阅读量:364 次
发布时间:2019-03-04

本文共 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/

你可能感兴趣的文章
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>