当前位置: 首页 > 知识库问答 >
问题:

在Kotlin多平台手机中用共享代码实现定时器

卢光誉
2023-03-14

我试图在一个Kotlin多平台移动项目的共享代码中实现一个计时器功能。计时器将运行n秒,每秒它将回调以更新UI。而且,UI中的一个按钮可以取消计时器。这不可避免地意味着我必须开始某种新线程,我的问题是哪一种机制是合适的--工人、关联者还是其他什么?

我尝试使用带有以下代码的coroutine,但在IOS上遇到了InvalidMutabilityException:

class Timer(val updateInterface: (Int) -> Unit) {
    private var timer: Job? = null

    fun start(seconds: Int) {
        timer = CoroutineScope(EmptyCoroutineContext).launch {
            repeat(seconds) {
                updateInterface(it)
                delay(1000)
            }
            updateInterface(seconds)
        }
    }

    fun stop() {
        timer?.cancel()
    }
}

我确实了解moko-time库,但我觉得这应该是可能的,而不需要依赖项,我想了解如何做到这一点。

共有1个答案

吴兴国
2023-03-14

正如您在注释中所怀疑的那样,updateInterface是包含类的属性,因此在lambda中捕获对该属性的引用也会冻结父类。这可能是冻结您的类的最常见和最令人困惑的方法。

我会尝试这样的方法:

class Timer(val updateInterface: (Int) -> Unit) {
    private var timer: Job? = null

    init {
        ensureNeverFrozen()
    }

    fun start(seconds: Int) {
        val callback = updateInterface
        timer = CoroutineScope(EmptyCoroutineContext).launch {
            repeat(seconds) {
                callback(it)
                delay(1000)
            }
            callback(seconds)
        }
    }

    fun stop() {
        timer?.cancel()
    }
}

它有点冗长,但是在lambda中捕获回调之前,为它创建一个本地val。

 类似资料:
  • 问题内容: 简而言之:在iPhone和Android版本之间共享/重用代码的最有效方法是什么? 我认为最常见的两种情况是: 空白计划新项目,提前知道每个设备上都需要运行大量可重用的逻辑。 现有的iPhone代码库,可将C,C ++和Objective-C移植到Android NDK或其他方式。 当然,在完美的世界中,所有应用程序都只会插入神奇的云中,而所有可重用的逻辑都将出现在Google App

  • 我在设置一个活动时遇到了问题,该活动驻留在KMM项目中的共享代码中,并使用Jetpack Compose。当活动是在Android源代码(/app)中时,这个操作很好。但我想发布一个共享的(/common)库,而不需要任何应用程序。 null 进程:com.surrus.peopleinspace,pid:4067 java.lang.nosuchmethoderror:没有静态方法setcont

  • 在KMM中是否可以有一些期望的抽象类?该项目是AndroidiOS 我希望有一些共享类,但部分方法应该是特定于平台的。 最好的方法是什么?也许是预期类和实际类的共享父类的某种组合? 例如, 据我所知,这样的例子是不可能的,因为预期的类应该是接口而不是抽象类。 对于两种平台,resetTimer方法可能相同。 不知怎么可能?

  • 在为Android实现平台特定的代码时,我遇到了以下错误。 [ERROR: flutter/lib/ui/ui_dart_state.cc(186)]未处理的异常:缺少插件异常(在通道plugins.flutter.io/path_provider上没有找到方法getTemporaryDirectory的实现)

  • 本文向大家介绍shell脚本实现同时多台远程主机执行命令的代码分享,包括了shell脚本实现同时多台远程主机执行命令的代码分享的使用技巧和注意事项,需要的朋友参考一下 实现需求 在对单台机器做操作时我们会用“ssh ip”的方式登录到机器上,可以写这样一个工具vssh ip1,ip2,…ipn 来模拟登录到n 台服务器,登录后所有操作相当于同时对n 台服务器生效。 实现方法 首页要确保可以通过本地

  • 类似问题:在Android Studio中的Android工具测试和单元测试之间共享代码 我的设置如下: 包含单元测试的< li> 文件夹。这些可以是Java或Kotlin类 包含仪器测试的< li> 。这些也可以是Java或Kotlin类 < li> 是一个文件夹,其中包含一组在单元测试和测量测试之间共享的实用程序。 这种共享在gradle中定义为: 这允许< code>src/test或< c