本文共 2920 字,大约阅读时间需要 9 分钟。
为了优化代码并确保UI操作在主线程执行,我们可以按照以下步骤进行修改和优化:
简化BaseCoroutines.kt中的suspend fun:
修改代码逻辑:
优化异常处理:
以下是修改后的代码:
package com.yzdzy.kotlin.chapter7.basicimport cn.kotliner.coroutine.common.HttpExceptionimport cn.kotliner.coroutine.common.HttpServiceimport cn.kotliner.coroutine.common.logimport cn.kotliner.coroutine.ui.LOGO_URLimport com.yzdzy.kotlin.chapter7.async.AsyncTaskimport java.lang.Exceptionimport javax.swing.SwingUtilitiesimport kotlin.coroutines.resumeimport kotlin.coroutines.resumeWithExceptionimport kotlin.coroutines.suspendCoroutinesuspend fun 我要开始加载图片了(url: String) = suspendCoroutine{ continuation -> AsyncTask { log("耗时下载图片") try { val reponseBody = HttpService.service.getLogo(LOGO_URL).execute() if (reponseBody.isSuccessful) { reponseBody.body()?.byteStream()?.readBytes?.let { // 在主线程更新UI SwingUtilities.invokeLater { continuation.resume(it) } } } else { // 在主线程更新UI并处理异常 SwingUtilities.invokeLater { continuation.resumeWithException(HttpException(reponseBody.code())) } } } catch (e: Exception) { // 在主线程更新UI并处理异常 SwingUtilities.invokeLater { continuation.resumeWithException(e) } } }.execute()}
package cn.kotliner.coroutine.uiimport cn.kotliner.coroutine.common.HttpErrorimport cn.kotliner.coroutine.common.HttpServiceimport cn.kotliner.coroutine.common.logimport com.yzdzy.kotlin.chapter7.async.AsyncTaskimport 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.SwingUtilitiesconst val LOGO_URL: String = "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("协程之后") }}
优化效果:
通过这些修改,代码更加优化,UI操作也更加流畅,满足了用户的需求。
转载地址:http://eosr.baihongyu.com/