Articles of coroutine

yield бросает исключение KotlinNullPointerException в buildSequence для проектов maven

Я просматриваю coroutines в Котлине, начиная с последовательности Фибоначчи: import kotlin.coroutines.experimental.buildSequence fun main(args: Array<String>) { val fibo = buildSequence { yield(0) var a = 0 var b = 1 while (true) { yield(b) b = a + b a = b – a } } fibo.take(5).forEach { println(it) } } Я использую IntelliJ IDEA, когда […]

правильное поведение сопрограмм?

Я начинаю kotlin и не уверен, что я правильно реализовал модель производителя и потребителя kotlin coroutines? @RestrictsSuspension interface Producer<in T> { suspend fun yield(value: T); } fun <T> produce(context: CoroutineContext = EmptyCoroutineContext, building: suspend Producer<T>.() -> Unit): Supplier<T> { val (NOT_READY, READY, DONE) = arrayOf(-1, 2, 3); val producer = object : Producer<T>, Continuation<Unit>, Supplier<T> […]

почему обработчик исключений coroutine удваивает исходное исключение?

Я реализую свой собственный async процесс, я не могу правильно обработать исключение. Зачем? val expected = IllegalStateException(); val it = async<Any> { throw expected; }; assert.that({ it.get() }, throws(equalTo(expected))); // ^— but it throws a IllegalStateException(cause = expected) Исходный код interface Response<in T> { suspend fun yield(value: T); } interface Request<out T> { fun get(): […]

ArrayBroadcastChannel: второй абонент не обновляет пользовательский интерфейс

В моем коде у меня есть ArrayBroadcastChannel, который отправляет строки двум подписчикам: val dataStream = ArrayBroadcastChannel<String>(1) … launch(viewModelJob + CommonPool) { val reader = BufferedReader(InputStreamReader(bluetoothSocket.inputStream)) while (viewModelJob.isActive) { reader.readLine()?.let { dataStream.send(it) } } } … launch(job + UI) { dataStream.consumeEach { if (it.isNumber()) { val coloredValue = asyncGetColoredValue().await() coloredDots.add(coloredValue) } } dataStream.consumeEach { if (it.isSampleMessage()) […]

Объявить окончательное удовольствие в интерфейсе

Я пишу кооперативный многопоточный движок в Котлине. Я пытаюсь написать интерфейс следующим образом: interface Processor { var suspendAction: (Continuation<Any>) -> Unit inline suspend fun yield() = suspendCoroutine(suspendAction) suspend fun process(inbox: Inbox) = Unit } yield() – это сервис, который я хочу предоставить всем разработчикам этого интерфейса. Поскольку каждый виртуальный сайт вызова представляет собой барьер для […]

Kotlin & Vertx & Mongo: Как управлять функциями async CRUD?

Друзья! Я – зеленая рука Веркса и Монго, теперь я столкнулся с трудной проблемой. Ниже приведены фрагменты кода. Вот класс оболочки Mongo Client. // MongoDatabase.kt import io.vertx.core.json.JsonObject import io.vertx.core.logging.LoggerFactory import io.vertx.kotlin.core.json.JsonObject import io.vertx.rxjava.core.Vertx import io.vertx.rxjava.ext.mongo.MongoClient import kotlin.reflect.KClass import kotlin.reflect.full.declaredFunctions class MongoDatabase<T: Any> (val tClass: KClass<T>, vertx: Vertx, config: JsonObject, databaseName: String) : Database<T> { private […]

Kotlin – альтернатива урожаю кортета Python и посылает

Что было бы идиоматической альтернативой Kotlin для следующего фрагмента скрипта python: def generator(): c = 1 while True: op = yield c if op == 'inc': c += 1 elif op == 'mult': c *= 2 # main g = generator() a = g.send(None) # start b = g.send('inc') c = g.send('mult') d = g.send('inc') […]

API вызова Coroutine

Я должен асинхронно вызывать API. Для этого я использую сопрограмму coroutine, но мне нужно подождать, пока API будет вызван для загрузки данных. Проблема следующая: Ожидание не работает так, как я хочу, он не ждет, пока API предоставит все данные. Ожидает, что мне нужно? Вот код: override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_see) launch { loaddata() […]

Как: стрелять и забывать асинхронные сопрограммы в Котлине

Я читал на койлинах Котлина, но не нашел ответа на конкретную проблему. Скажем, я хочу перебирать коллекцию, создавая вызов API для каждого элемента (в этом конкретном случае нажатие файла на Amazon S3). Я хочу, чтобы эти вызовы обрабатывались асинхронной сопрограммой, чтобы не блокировать основной поток во время ожидания. Мне не требуется возвращаемое значение из запроса, […]

Как запустить метод suspend посредством отражения?

Существует блок сопрограммы, который может запускать функции приостановки. Но я вызываю функцию путем invoke через отражение. Это вызов Java-стиля, по-видимому, простой вызов не будет работать. Существуют ли способы запуска отраженного метода асинхронно? Как дождаться этого метода? import kotlin.coroutines.experimental.* class TestClass(val InString: String) { suspend fun printString() { println(InString) } } fun launch(context: CoroutineContext, block: suspend […]