kotlin使用timerTask{}执行协程任务失效问题

在Android服务中尝试使用TimerTask结合协程创建定时通知,但发现协程任务未按预期执行。代码调试显示TimerTask的协程任务只运行了一次。目前问题已阐述,寻求解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做需求在androidServer里做一个通知,本来想的用timerTask{}+协程来做,结果发现一直不执行代码,debug到此处也莫名奇妙跳过。之后发现问题,但是没解决,总结如下:

service代码

 val scheduledThreadPool = Executors.newScheduledThreadPool(2)//一个线程的并行任务线程池 。。
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        startTimer()
        return START_REDELIVER_INTENT
    }
 /**
     * 开启定时器 轮训执行任务
     */
    private fun startTimer(){

        val task2 = object:TimerTask(){
            override fun run() {
                Log.i(TAG,"协程前  task2" )
                coroutine(//耗时cao
                    {NetWorkOperating().initHttpUrlConnection(centerHospitalUidParameter, NetWorkOperating.GET_UN_REPORT_COUNT)}
                ){
                    Log.i(TAG,"我再执行 $unReportQuantity  task2" )
            
                }
            }
        }

        val task = timerTask {
            Log.i(TAG,"协程前   task" )
            //获取未查阅报告数量
            coroutine(//耗时操作
                {NetWorkOperating().initHttpUrlConnection(centerHospitalUidParameter, NetWorkOperating.GET_UN_REPORT_COUNT)}
            ){
                Log.i(TAG,"我再执行 $unReportQuantity  task1" )
            
            }
        }
        scheduledThreadPool.scheduleWithFixedDelay(task2,1000,10000,TimeUnit.MILLISECONDS)
        scheduledThreadPool.scheduleWithFixedDelay(task,1000,10000,TimeUnit.MILLISECONDS)
    }
上图 task、与task2 其实是一样的  timerTask{}源码如下:



设置封装的协程(从大佬那里cv的,是真滴好用)

    private fun <T> coroutine(block: suspend CoroutineScope.() -> T, uiBlock: suspend (T) -> Unit): Deferred<T> {
        val deferred = async(CommonPool, CoroutineStart.DEFAULT,block)
        launch(UI){
            uiBlock(deferred.await())
        }
        return deferred
    }
执行结果截图:

明显看到 task1只执行了1次。

问题阐述完毕,但是不知道为什么不去执行。有大佬看到解决,请留个言。



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值