Я пытаюсь запустить рекурсивную функцию в фоновом потоке и иметь возможность отменить ее и перезапустить, когда пользователь нажимает кнопку. Я прочитал некоторые основы сопрограмм, но до сих пор не освоился. Может ли кто-нибудь предложить лучшее решение?
Кроме того, я пытаюсь выбрать между двумя версиями рекурсивной функции. Один возвращает свое значение через стек, а другой просто обновляет свойство класса без возврата. Кажется, оба работают правильно, а второй завершается немного быстрее.
Есть ли какие-либо проблемы при запуске рекурсивной функции без возвратов?
Вот мой код. Он компилируется и правильно работает в эмуляторе Android (конечно, мне нужно нажать «Подождать» во всплывающем окне ANR).
Образец данных заканчивается примерно через 95 или 91 секунду. В действительности список может содержать любое количество элементов, каждый из которых имеет список из любого количества целых чисел.
data class Item(var numbers: List)
class CalcEngine(
) {
val data: List = listOf(
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
)
fun calculate() {
val time1 = measureTimeMillis {
Log.d(TAG, "starting countWithReturn()...")
Log.d(TAG, "count: ${countWithReturn()}")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time1 / 1000L }s.")
// sample data finishes in 95s.
Log.d(TAG, "")
testCount = 0UL
val time2 = measureTimeMillis {
Log.d(TAG, "starting countNoReturn()...")
countNoReturn()
Log.d(TAG, "count: $testCount")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time2 / 1000L }s.")
// sample data finishes in 91s.
Log.d(TAG, "===================================")
Log.d(TAG, "")
}
fun countWithReturn(index: Int = 0): ULong {
if(index == data.size - 1 ) {
var count = 0UL
for(i in 0..
Подробнее здесь: https://stackoverflow.com/questions/792 ... -so-that-i
Как лучше всего использовать рекурсивную функцию в сопрограмме Kotlin, чтобы ее можно было отменить и перезапустить? ⇐ Android
Форум для тех, кто программирует под Android
1732726927
Anonymous
Я пытаюсь запустить рекурсивную функцию в фоновом потоке и иметь возможность отменить ее и перезапустить, когда пользователь нажимает кнопку. Я прочитал некоторые основы сопрограмм, но до сих пор не освоился. Может ли кто-нибудь предложить лучшее решение?
Кроме того, я пытаюсь выбрать между двумя версиями рекурсивной функции. Один возвращает свое значение через стек, а другой просто обновляет свойство класса без возврата. Кажется, оба работают правильно, а второй завершается немного быстрее.
Есть ли какие-либо проблемы при запуске рекурсивной функции без возвратов?
Вот мой код. Он компилируется и правильно работает в эмуляторе Android (конечно, мне нужно нажать «Подождать» во всплывающем окне ANR).
Образец данных заканчивается примерно через 95 или 91 секунду. В действительности список может содержать любое количество элементов, каждый из которых имеет список из любого количества целых чисел.
data class Item(var numbers: List)
class CalcEngine(
) {
val data: List = listOf(
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
)
fun calculate() {
val time1 = measureTimeMillis {
Log.d(TAG, "starting countWithReturn()...")
Log.d(TAG, "count: ${countWithReturn()}")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time1 / 1000L }s.")
// sample data finishes in 95s.
Log.d(TAG, "")
testCount = 0UL
val time2 = measureTimeMillis {
Log.d(TAG, "starting countNoReturn()...")
countNoReturn()
Log.d(TAG, "count: $testCount")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time2 / 1000L }s.")
// sample data finishes in 91s.
Log.d(TAG, "===================================")
Log.d(TAG, "")
}
fun countWithReturn(index: Int = 0): ULong {
if(index == data.size - 1 ) {
var count = 0UL
for(i in 0..
Подробнее здесь: [url]https://stackoverflow.com/questions/79231228/what-is-the-best-way-to-use-a-recursive-function-in-a-kotlin-coroutine-so-that-i[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия