@kotlin_lang

Страница 507 из 982
Денис
24.01.2018
20:14:14
там должна быть по новее ?
Нейминг не очень традиционный

Dumitru
24.01.2018
20:22:43
все получилось, спс

наверно все новички ошибаются и пишут в buildscript{}

Andrew
24.01.2018
21:06:40
Нейминг не очень традиционный
GitHub советует использовать префикс "v" на странице создания нового релиза (технически противореча правилам semver), а JitPack опирается на названия релизов / тегов с GitHub -- отсюда и ноги растут.

Google
Денис
24.01.2018
21:08:38
GitHub советует использовать префикс "v" на странице создания нового релиза (технически противореча правилам semver), а JitPack опирается на названия релизов / тегов с GitHub -- отсюда и ноги растут.
Я не говорю, что он в целом неправильный или неиспользуемый - он нехарактерный для нейминга джава-модулей/приложений (которые обычно блюдут semver, да). Понятно, что некоторая логика есть. :)

Andrew
24.01.2018
21:10:07
Я ж исключительно конкретную причину пояснил -- сам в своё время удивился, теперь знаю, что v в мавен-координатах -- значит почти наверняка зависимость тянется с джитпака :)

Sergey
24.01.2018
21:52:33
https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.22

Kylych
25.01.2018
03:11:14




подскажите, почему тут явно требуется писать ключевое слово object? Ведь во втром случае, проходит норм.

интерфейсы одинаковые.

Tipok
25.01.2018
03:14:29
Попробуй с такими () скобочками, в ошибке же написано

Не может найти конструктор

Kylych
25.01.2018
03:15:33
я загуглил, в случае с ItemListener, надо явно прописывать object: ItemListener{}

Tipok
25.01.2018
03:16:38
Ну это ты уже создаёшь класс с переелпределенными методами и возвращаешь как бы его

Kylych
25.01.2018
03:17:24
по структуре, Runnable и ItemListener одинаковые интерфейсы.

Andrew
25.01.2018
05:30:53
ItemListener описан на котлине?

Google
Andrew
25.01.2018
05:32:08
Runnable { } -- это превращение котлин-лямбды в джавовский SAM, а в самом котлине SAM нету. я полагаю, это именно оно.

Dumitru
25.01.2018
06:35:15
Доброго всем утра

Я правильно пишу корутины ?



Google.speak() - просто проигрывает в слух текст

Все вызовы Google.speak() проигрываются одновременно

Vladimir
25.01.2018
06:38:44
Нет Как минимум, последняя строчка - это бред 4 корутины запускаются параллельно (или как их распределит CommonPool) Google.speak() - это suspending function, или блокирующий вызов?

Dumitru
25.01.2018
06:39:02
Вот, это меня и беспокоит

fun speak(text: String, lang: String) {}

простая функция )

Без async { }.await() , поток main закрывается

Vladimir
25.01.2018
06:40:54
Рекомендую почитать https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md

Dumitru
25.01.2018
06:41:13
(для примера) как правильно сделать что бы текст в Google.speak() проигрывался одновременно ?

Vladimir
25.01.2018
06:43:23
Dumitru
25.01.2018
06:46:16
Без пояснения, что будет внутри Google.speak(), трудно сказать
Там ничего особеного. Получаем audio.mp3 и проигрываем его в плеере.

Вот:



Она не имеет никаких фишек из класса корутин

Vitalii
25.01.2018
06:47:58
Если правильно понимаю, то нужно его сделать suspend. Тип, suspend fun speak(...)

Google
Dumitru
25.01.2018
06:48:33
если сделать suspend то IDEA подчеркивает серым говоря что так не надо



suspend не ругается только когда внутри него есть: delay(1000L)

но зачем ставить там задержку я не вижу логики

Roman
25.01.2018
06:53:56
launch запускает короутину на CommonPool, который реализован через ForkJoinPool. Это равносильно просто запуску ForkJoinPool.execute { speak() } и будет работать параллельно только до тех пор, пока не достигнет размера пула потоков в нем (обычно 2*cpu cores).

Dumitru
25.01.2018
06:55:01
то есть все вызовы Google.speak() оборачивать просто в launch ?

Roman
25.01.2018
06:55:38
Поэтому если хочется сделать запуск параллельных задачь на любом железе и с любым количеством, то нужно использовать пул потоков без ограничения на их количество.

Dumitru
25.01.2018
06:56:56
Так как это сделать ?

Roman
25.01.2018
06:57:31
Это можно сделать так: val UNLIMITED = Executors.newCachedTreadPool().asCoroutineDispatcher() launch(UNLIMITED) { speak() }

Dumitru
25.01.2018
06:57:50
сейчас

Vladimir
25.01.2018
06:59:42
то есть все вызовы Google.speak() оборачивать просто в launch ?
Нет, надо сделать так, чтобы Google.speak() работала как нормальная suspend-функция. Для этого желательно надо понять, как вообще работать с корутинами. Либо просто взять пул потоков и блокировать потоки на время воспроизведения. Но зачем тогда вообще прикручивать корутины?

Roman
25.01.2018
07:00:12
Теперь как правильно ждать... В общем launch возвращает объект job, тебе нужно все job-ы собрать в массив и подождать их выполнения: val jobs = arrayListOf<Job?) jobs += launch(UNLIMITED) { speak() } ... jobs.forEach { it.join() }

Roman
25.01.2018
07:01:10
Но вообще да, тут короутины нафиг не нужны, можно обойтись стандартной библиотекой явы.

Dumitru
25.01.2018
07:01:45
так я писал где то выше :D

я через Thread сделал, но потом в чате писали "Делай через корутины .."

Лан одно другому не мешает, хорошо что получилось

Roman
25.01.2018
07:03:28
Тут нужно четко понимать что тебе нужно. Если нужна сложная логика из воспроизведений, UI и ожиданий, то короутины в этом деле помогут.

Если нужно просто хором проговорить цифры, то явы достаточно.

Dumitru
25.01.2018
07:04:57
Я это взял для примера, так лучше понимать что все запустилось асинхронно

Google
Boris
25.01.2018
07:06:06
Я это взял для примера, так лучше понимать что все запустилось асинхронно
Асинхронно и параллельно это разные вещи, ты запускаешь параллельно, те одновременно

Roman
25.01.2018
07:06:14
+

Dumitru
25.01.2018
07:06:33
ну лан, парарельно тогда

Boris
25.01.2018
07:06:41
Причем даже сам точно не знаешь сколько из них запустится параллельно

Потому что работаешь с дефолтным пулом

ну лан, парарельно тогда
Я не придираюсь к словам, я просто хочу сказать, что корутины сами по себе позволяют добиться остановки выполнения в какой-то точке кода, и потом возобновить выполнение в произвольный момент, одновременное выполнение все рано проходить в потоках как и раньше, просто поверх них используются удобства корутин, чтобы избежать тучи колбеков

Dumitru
25.01.2018
07:12:35
ок, я еще доков почитаю и видео обзоры посмотрю, будет норм, спс

еще один вопрос, как закрыть UNLIMITED, программа не завершается и ждет что то.. ? val UNLIMITED = Executors.newCachedThreadPool().asCoroutineDispatcher() launch(UNLIMITED) { GoogleTrying().speak("тест текста", "ru") }

Roman
25.01.2018
07:23:13
Ну вообще чтобы остановить любой тред пул, надо вызвать shutdownNow()

Это после join-ов.

Но вообще простая консольная программа не должна ждать... странно.

Завершения main функции вроде как достаточно чтобы процесс остановился.

Dumitru
25.01.2018
07:26:22
Ладно, смотри если правильно написал:



Roman
25.01.2018
07:27:57
Неа, в этом случае она может завершиться недовыполнив твои задачи. Но я могу наврать, не помню точно условий завершения консольных ява программ.

Vladimir
25.01.2018
07:33:01
Неа, в этом случае она может завершиться недовыполнив твои задачи. Но я могу наврать, не помню точно условий завершения консольных ява программ.
Поток main такой же, как и все остальные. Если после выполнения main() ещё останутся не-daemon потоки, JVM будет жить дальше, пока они не завершатся.

Roman
25.01.2018
07:34:24
О как, а как же потоки, что живут внутри ForkJoinPool?

Их же нельзя просто так убить.

Gleb
25.01.2018
07:41:08
https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.22
>Introduced stable public API for AbstractCoroutine @relizarov stable это не-experimental?

Google
Roman
25.01.2018
07:43:13
Это апи для писателей библиотек. Думается мне, это гарантия, что оно не изменится даже после снятия experimental статуса с корутин.

Sergey
25.01.2018
07:43:19
https://github.com/Kotlin/kotlinx.coroutines/compare/0.21...0.22

довольно много поменяли

Roman
25.01.2018
08:12:00
stable это значит тот, который мы не будет ломать в будущих версиях. Тот API, который мы ломаем, либо помечен internal либо сделан public но там коментарий навешен типа: * @suppress **This is unstable API and it is subject to change.**

stable значит, что если вы сделаете на основе этого API свой код/библоитеку, то он будет binary compatible с более новыми версиями kotlinx.coroutines. Source compatibility может пропасть (иногда что-то делаем deperecate+hide)

Вот раньше с AbsractCoroutine такая истори и была. Он был public, но unstable (его нельзя было использовать за пределами kotlinx.coroutines из-за частных изменений)

Vladimir
25.01.2018
08:18:35
О как, а как же потоки, что живут внутри ForkJoinPool?
ForkJoinPool делает своим потокам setDaemon(true)

Roman
25.01.2018
08:20:05
Ага, теперь понятно.

Ruslan
25.01.2018
09:12:32
Вы пользуетесь темной или светлой темой в IDE Темной – 207 ??????? 70% Светлой – 64 ?? 22% Периодически их меняю – 19 ? 6% Пользуюсь стандартной, мне все равно – 6 ▫️ 2% ? 296 people voted so far.

Andrew
25.01.2018
09:26:49
val pool = Executors.newCachedThreadPool() val dispatcher = pool.asCoroutinesDispatcher() launch(dispatcher) { ... } ... pool.shutdown()

Artiom
25.01.2018
10:47:53
Всем доброго дня. Подскажите, пишу приложение для имитации игры на гитаре. Какие инструменты, библиотеки использовать для обработки нажатия на определённые части картинки? В моем случае струны гитары

Kevin
25.01.2018
12:15:30
How can i replace a value in this arraylist like i want to replace "bbb" so that it can be "bb":"999" [{ "aaa": "#FF7B5CC1", "bbb": "000", "ccc": "ghffh" }] val arrayList = Arrays.asList<MyModel>(newitem)

Страница 507 из 982