简体   繁体   English

如何在 Kotlin 中使用协程创建多个无限循环

[英]How to create multi infinity loops with coroutine in Kotlin

I have a method in viewmodel that I want to execute infinity till client stop that.我在 viewmodel 中有一个方法,我想无限执行直到客户端停止它。

This loop should work for each button separately and stop that too.这个循环应该分别适用于每个按钮并停止它。 But when I execute the loop for fourth time, application hangs.但是当我第四次执行循环时,应用程序挂起。 How can I manage the loop and run it for four separate objects如何管理循环并为四个单独的对象运行循环

This is my method in viewmodel:这是我在视图模型中的方法:

fun getLocationInfinity(context: Context, tripId: Long, passengerId: Int) =
    viewModelScope.launch {
            val gpsTracker = LocationGpsTracker(context, 0, 0)
            val netGpsTracker = LocationGpsTrackerNetwork(context)
            var way = Way()
            way.latitude1 = gpsTracker.getLatitude()
            way.longitude1 = gpsTracker.getLongitude()
            way.accuracy1 = gpsTracker.getAccuracy()
            way.latitudeNet1 = netGpsTracker.getLatitude()
            way.longitudeNet1 = netGpsTracker.getLongitude()
            way.accuracyNet1 = netGpsTracker.getAccuracy()

            while (isActive) {

                if (_passengerSwitch.value?.get(passengerId - 1) == true) {
                way.latitude2 = way.latitude1
                way.longitude2 = way.longitude1
                way.accuracy2 = way.accuracy1
                way.latitudeNet2 = way.latitudeNet1
                way.longitudeNet2 = way.longitudeNet1
                way.accuracyNet2 = way.accuracyNet1
                way.latitude1 = gpsTracker.getLatitude()
                way.longitude1 = gpsTracker.getLongitude()
                way.accuracy1 = gpsTracker.getAccuracy()
                way.latitudeNet1 = netGpsTracker.getLatitude()
                way.longitudeNet1 = netGpsTracker.getLongitude()
                way.accuracyNet1 = netGpsTracker.getAccuracy()
                _way.postValue(way)
                val tripDetails = TripDetails(
                    latitude1 = way.latitude1,
                    latitude2 = way.latitude2,
                    longitude1 = way.longitude1,
                    longitude2 = way.longitude2,
                    accuracy1 = way.accuracy1,
                    accuracy2 = way.accuracy2,
                    latitudeNet1 = way.latitudeNet1,
                    latitudeNet2 = way.latitudeNet2,
                    longitudeNet1 = way.longitudeNet1,
                    longitudeNet2 = way.longitudeNet2,
                    accuracy1Net = way.accuracyNet1,
                    accuracy2Net = way.accuracyNet2,
                    distance = null,
                    isCalculated = false,
                    tripId = tripId.toInt(),
                    isEnded = false
                )
                localRepository.insertLocation(tripDetails)
                delay(2000)
            }
        }


    }

The delay() call needs to be outside your if-block. delay()调用需要在您的 if 块之外。 Otherwise, if the condition is false, this loop will never suspend so it never relinquishes the thread.否则,如果条件为假,此循环将永远不会挂起,因此它永远不会放弃线程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM