【问题标题】:Android : suppress multiple invocations of coroutinesAndroid:抑制协同程序的多次调用
【发布时间】:2021-02-24 12:13:16
【问题描述】:

在Android + kotlin中抑制多次调用协程有什么好主意吗?

我编写了以下代码。它适用于我的目的,但我想知道是否有更聪明的方法来编写它。

class MainViewModel : ViewModel() {
    
    private val mutex = Mutex()
    private var job : Job? = null

    fun processCoroutine() {
        viewModelScope.launch {
            mutex.withLock {
                if (job == null) {
                    job = viewModelScope.launch {

                        // heavy process                 

                        mutex.withLock {
                            job = null
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

标签: android kotlin coroutine


【解决方案1】:

如果你只从主线程中访问job 属性,它会更简单。

class MainViewModel : ViewModel() {
    
    private var job : Job? = null // main thread only

    @MainThread
    fun processCoroutine() {
        if (job != null) {
            return
        }
        job = viewModelScope.launch {
            // heavy process
            // ...
            job = null
        }
    }

    // If needed...
    @MainThread
    fun cancelCoroutine() {
        job?.cancel()
        job = null
    }

}

如果您希望您的函数可以从任何线程调用:

class MainViewModel : ViewModel() {
    
    private var job : Job? = null // main thread only

    fun processCoroutine() = viewModelScope.launch {
        if (job != null) {
            return@launch
        }
        job = viewModelScope.launch {
            // heavy process
            // ...
            job = null
        }
    }

    // If needed...
    fun cancelCoroutine() = viewModelScope.launch {
        job?.cancel()
        job = null
    }

}

【讨论】:

    【解决方案2】:

    您可以检查Job是否为active,只有在不活动时才再次调用

    private var job: Job = Job()
    fun processCoroutine2() {
        viewModelScope.launch {
            if (!job.isActive) {
                job = viewModelScope.launch {
                    //heavy process 
                    //once done it will become inactive
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多