欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 17:40:51
...

今天在做需求在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{}源码如下:

kotlin使用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
    }
执行结果截图:

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

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

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