当前位置: 首页 > article >正文

kotlin定时器和主线程定时器

场景

最近要用kotlin写一个每隔一段时间切视频并截图

刷刷的就写出来了,很快啊

timerTask = object : TimerTask() {
    override fun run() {
        captureWindow()
        if ((group + 1) * 4 >= urls.size) {
            showDialog()
            timerTask.cancel()
            timer.cancel()
        }
        group++
        updatePlayers()
    }
}
timer = Timer()
timer.schedule(timerTask, 15000, 15000)

结果一运行就闪退了

Player is accessed on the wrong thread
java.lang.IllegalStateException: Player is accessed on the wrong thread.
Current thread: 'Timer-0'
Expected thread: 'main'

https://developer.android.com/media/media3/exoplayer/hello-world#a-note-on-threading

它意思是 Exoplayer 的实例必须从主线程访问,但是呢,我们现在是在定时器子线程(Timer-0)内部访问的

一直和单线程 js 打交道的人生,哪里懂得什么主线程子线程/(ㄒoㄒ)/~~

思路一

如果让子线程发送 Event 到主线程,由主线程响应,然后主线程去操作 Exoplayer,不就好了吗

悲伤的是,AI 写的代码驴头不对马嘴,只能自己去官方文档上现学。

https://kotlinlang.org/api/latest/jvm/stdlib/org.w3c.dom.events/-event-target/

结果搜了半天,发现唯一与 Event 有关的是“活动”

kotlin 好像和 js 这种不大一样,js 的核心就是处理事件和响应事件,但是 kotlin 不是为这方面设计的

不过我觉得往这个方向没问题,可能需要学习协程相关的吧

思路二

虽然没有 setInterval,但是 kotlin 是有等效于 setTimeout 的方法的
android.os.Handler 可以实现过一段事件执行某段代码

Handler(Looper.getMainLooper()).postDelayed(
    {
        captureWindow()
        if ((group + 1) * 4 >= urls.size) {
            showDialog()
        }
        group++
        updatePlayers()
    },
    15000
)

接着发挥传统艺能把 setTimeout 改写为 setInterval

    private fun updateEvery15s() {
        fun mySetTimeout() {
            Handler(Looper.getMainLooper()).postDelayed(
                {
                    captureWindow()
                    if ((group + 1) * 4 >= urls.size) {
                        showDialog()
                    } else {
                        group++
                        updatePlayers()
                        mySetTimeout()
                    }

                },
                if (group == 0) 20000 else 15000
            )
        }
        mySetTimeout()
    }

完成!


http://www.kler.cn/news/365746.html

相关文章:

  • 使用xml发送国际短信(smspro)【吉尔吉斯斯坦】
  • 东方博宜1180 - 数字出现次数
  • 基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)
  • 海港[NOIP2016]
  • 实现可扩展人工智能的便捷之路:英特尔 Tiber 开发者云 + MinIO 对象存储
  • 信息安全工程师(55)网络安全漏洞概述
  • Python的变量与数据类型——变量的定义
  • 今日头条躺赚流量:自动化新闻爬取和改写脚本
  • vue3 + VIte + TS 移动端 H5 项目屏幕适配,PC端响应式布局
  • 监控易监测对象及指标之:Weblogic中间件监控
  • 美的智能制造MES与WMS系统:打造高效、协同的制造与物流管理平台|203页PPT
  • 【使用Flask构建RESTful API】从零开始开发简单的Web服务!
  • OpenAI o1:AI新范式及未来的10个影响
  • 基于深度学习的虚拟化装系统设计与实现
  • 数据结构.单链表
  • 青少年编程与数学 02-002 Sql Server 数据库应用 11课题、视图的操作
  • Spire.PDF for .NET【页面设置】演示:在 C# 中应用 PDF 页面转换
  • Pytorch与深度学习 #10.PyTorch训练好的模型如何部署到Tensorflow环境中
  • AnaTraf | 全面掌握网络健康状态:全流量的分布式网络性能监测系统
  • 数字电路week3
  • 听见文本的魅力:AI 与未来的语音交互
  • 代码随想录第九天|151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr() 、459.重复的子字符串
  • 【VUE点击父组件按钮,跳转到子组件】
  • Codeforces Round 979 (Div. 2) C. A TRUE Battle
  • R语言中的Lasso回归:全面指南与实战案例
  • electron展示下载进度条