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

本文共 2920 字,大约阅读时间需要 9 分钟。

为了优化代码并确保UI操作在主线程执行,我们可以按照以下步骤进行修改和优化:

  • 简化BaseCoroutines.kt中的suspend fun

    • 移除不必要的拦截器和wrapper类,直接在闭包内处理UI更新。
    • 使用SwingUtilities.invokeLater在主线程上执行UI更新任务。
  • 修改代码逻辑

    • 在成功和失败的情况下,分别使用SwingUtilities.invokeLater进行UI更新。
    • 处理异常时,确保异常信息也在主线程上显示。
  • 优化异常处理

    • 使用try-catch块捕获异常,并在主线程上进行处理。
    • 确保所有错误信息都能正确显示在UI上。
  • 以下是修改后的代码:

    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()}
    1. 优化主函数
      • 确保主函数中的UI操作也在主线程执行。
      • 使用SwingUtilities.invokeLater来更新UI元素。
    2. 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("协程之后") }}

      优化效果

      • 简洁性:代码更加简洁,移除了不必要的拦截器和wrapper类。
      • 可读性:逻辑清晰,易于理解和维护。
      • 可维护性:减少了对第三方库的依赖,代码结构更为简洁。
      • 性能:确保了UI操作在主线程执行,避免了UI冻结和应用程序崩溃。
      • 异常处理:更有效地处理异常,确保了应用程序的稳定性。

      通过这些修改,代码更加优化,UI操作也更加流畅,满足了用户的需求。

    转载地址:http://eosr.baihongyu.com/

    你可能感兴趣的文章
    二分查找(递归)
    查看>>
    猜字母
    查看>>
    Eclipse导出项目出现resource is out of sync with the file...错误
    查看>>
    奇怪的分式(枚举 + 判断)
    查看>>
    Linux网络环境配置(设置ip地址)
    查看>>
    Idea使用Spring Initializr来快速创建springboot项目
    查看>>
    C++邻接表存储图的深度优先搜索
    查看>>
    C++实现Dijkstra算法(单源路径最短算法)
    查看>>
    Dijkstra算法输出最短路径
    查看>>
    Dijkstra算法的总结
    查看>>
    zoj 3964 - Yet Another Game of Stones
    查看>>
    前后端通信问题 —— SpringBoot+LayUI
    查看>>
    ubuntu中安装scikit-learn
    查看>>
    Ubuntu2004 向日葵安装笔记
    查看>>
    Ubuntu 安装后无法正常打开——进入grub安全命令行模式
    查看>>
    C/C++ new和delete使用注意事项
    查看>>
    Jmeter (一) ----环境搭建
    查看>>
    性能调优优化思路
    查看>>
    CodeBase(四)项目总结
    查看>>
    【ACM】HDU 5640 King‘s Cake
    查看>>