首页 > 解决方案 > 协程作业一键操作

问题描述

变量声明

private lateinit var wayoJob: Job
override val coroutineContext: CoroutineContext
    get() = Dispatchers.Main + wayoJob

功能

@InternalCoroutinesApi
private fun startRepeatingJob(timeInterval: Long): Job {
    return CoroutineScope(Dispatchers.Default).launch {
        while (NonCancellable.isActive) {

            Log.i("API", "UPDATE")

            delay(timeInterval)
        }
    }
}

在开始按钮中

wayoJob = startRepeatingJob(5000L)

在 Button end 和 onDestroy()

wayoJob.cancel()

当我单击结束按钮时,它返回一个错误:

引起:kotlin.UninitializedPropertyAccessException:lateinit 属性 wayoJob 尚未初始化

有没有办法解决?

我必须做一个功能,当我按下一个按钮时每隔几秒钟开始执行一次,当我点击另一个按钮时会结束。

编辑:

我可以用我自己的shouldBeActive价值尝试这样的事情,并在需要时运行,但这不是应该的

var shouldBeActive = false

@InternalCoroutinesApi
private fun startRepeatingJob(timeInterval: Long): Job {
    return CoroutineScope(Dispatchers.Default).launch {
        while (NonCancellable.isActive && shouldBeActive) {

            Log.i("API", "UPDATE")

            delay(timeInterval)
        }
    }
}

标签: androidkotlinkotlin-coroutinescoroutine

解决方案


我找到了解决方案。

我有一个活动重新加载并且对象重置

解决方案是像下面这样插入它。此解决方案可确保同时不会创建第二个对象

companion object {
    private lateinit var wayoJob: Job
}

示例全班:

class StartActivity : AppCompatActivity(), CoroutineScope {
    companion object {
        private lateinit var wayoJob: Job
    }

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + wayoJob

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_start)
    }

    @InternalCoroutinesApi
    private fun startRepeatingJob(timeInterval: Long): Job {
        return CoroutineScope(Dispatchers.Default).launch {
            while (NonCancellable.isActive) {

                Log.i("API", "UPDATE")

                delay(timeInterval)
            }
        }
    }

    @InternalCoroutinesApi
    fun endBtnOnClick(view: View?) {
        wayoJob.cancel()
    }

    @InternalCoroutinesApi
    fun startBtnOnClick(view: View?) {
        wayoJob = startRepeatingJob(5000L)
    }

    override fun onDestroy() {
        super.onDestroy()
        wayoJob.cancel()
    }
}

推荐阅读