新增依赖

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

新建ui包 

新建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 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("协程之前")
// 我要开始协程啦(DownloadContext(LOGO_URL)) {
// log("协程开始")
// try {
// val imageData = 我要开始耗时操作了 {
// 我要开始加载图片啦(this[DownloadContext]!!.url)
// }
// log("拿到图片")
// frame.setLogo(imageData)
// } catch(e: Exception) {
// e.printStackTrace()
// }
// }
// log("协程之后")
// }

frame.onButtonClick {
HttpService.service.getLogo(LOGO_URL)
.enqueue(object : Callback<ResponseBody> {
override fun onResponse(
call: Call<ResponseBody>,
response: Response<ResponseBody>) {
if (response.isSuccessful) {
val imageData = response.body()?.byteStream()?.readBytes()
if (imageData == null) {
} else {
SwingUtilities.invokeLater {
frame.setLogo(imageData)
}
}
} else {
}
}

override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
}

})
}
}

新建 MainWindow.java

package cn.kotliner.coroutine.ui

import java.awt.BorderLayout
import java.awt.Dimension
import java.awt.event.ActionEvent
import javax.swing.*


/**
* Created by benny on 5/20/17.
*/
class MainWindow : JFrame() {

private lateinit var button: JButton
private lateinit var image: JLabel

fun init() {
button = JButton("点我获取慕课网Logo")
image = JLabel()
image.size = Dimension(200, 80)

contentPane.add(button, BorderLayout.NORTH)
contentPane.add(image, BorderLayout.CENTER)
}

fun onButtonClick(listener: (ActionEvent) -> Unit) {
button.addActionListener(listener)
}

fun setLogo(logoData: ByteArray) {
image.icon = ImageIcon(logoData)
}
}

新建包common

新建HttpService.kt

package cn.kotliner.coroutine.common

/**
* Created by benny on 5/20/17.
*/
import okhttp3.ResponseBody


/**
* Created by benny on 5/20/17.
*/
object HttpService {

val service by lazy{
val retrofit = retrofit2.Retrofit.Builder()
.baseUrl("http://www.imooc.com")
.addConverterFactory(retrofit2.converter.gson.GsonConverterFactory.create())
.build()

retrofit.create(cn.kotliner.coroutine.common.Service::class.java)
}

}

interface Service{

@retrofit2.http.GET
fun getLogo(@retrofit2.http.Url fileUrl: String): retrofit2.Call<ResponseBody>

}

运行Mainkt.kt

运行后点击上面获取logo效果如下