博客
关于我
【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/

你可能感兴趣的文章
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>