@kotlin_lang

Страница 672 из 982
Artem
16.05.2018
14:51:04
platform declaration clash: the following declaration have the some jvm signature

wtf?

Костя
16.05.2018
14:52:11
А причем тут coroutines?
смотрите, я юзал BehaviorSubject для этого, сейчас я решил уйти от Rx в сторону корутин, аналог я в принципе нашел BrodcastChannel, но ради него нужно либу reactive-streams врубать, чего ради одного объекта делать не хочется совсем

Quantum Harmonizer
16.05.2018
14:52:25
wtf?
ну, столкновение сигнатур

Google
Alexander
16.05.2018
15:19:20
так а что, никто c либой Exposed не работает? Оо

Oleksandr
16.05.2018
15:46:31
Я работаю но не на топ лэвел

Alexander
16.05.2018
16:33:53
как ты ограничиваешь количество выводимых строк?

не понимаю, как добавить такие фичи как DBMS и ROWNUM

и же с ними

Костя
17.05.2018
06:48:22
Можно сделать проще и без каналов. Примерно так: var task: Deferred<Unit>? = null fun startLoadOnScreen1() { task = async(UI) { doJob() } } fun waitForCompletionOnScreen2() { showProgress() launch(UI) { try { val result = task!!.await() showResult() } catch (e: Exception) { showError() } } }
Спасибо, вполне элегантное решение, попробую, а почему в одном случае вы используете async, а в другом launch, разве у них не только разница в возвращаемом объекте ? Но и в принципах работы

Roman
17.05.2018
06:53:47
Во втором случае тоже можно использовать async, но я предпочитаю использовать launch чтобы случайно не потерять ошибку. async ведь ее проглотит.

Roman
17.05.2018
06:57:45
Подробнее можно почиать в доке. https://github.com/Kotlin/kotlinx.coroutines/blob/master/core/kotlinx-coroutines-core/README.md Ток вот что-то она не открывается...

Алексей
17.05.2018
06:59:05
Спасибо

Roman
17.05.2018
06:59:48
Короче launch в случае ошибки покрашит программу, а async нет, вместо этого исключение бросится при вызове await.

Алексей
17.05.2018
07:01:38
А launch разве в том же потоке отрабатывает?

Google
Костя
17.05.2018
07:05:14
А launch разве в том же потоке отрабатывает?
Что и async ? Ну вроде да, в том что укажешь

Roman
17.05.2018
07:05:34
А launch разве в том же потоке отрабатывает?
А какая разница какой поток. Если не установлен UncaughtExceptionHandler, приложение упадет в любом случае.

Алексей
17.05.2018
07:05:59
А, понял суть

То есть launch - это как async, только всё, что есть он выбрасывает куда-то

Вместо возвращенного объекта deferred, как у async

Roman
17.05.2018
07:07:16
Ну да, что-то типа того.

Еще разница в том, что async возвращает Deferred, а launch возвращает Job.

Костя
17.05.2018
07:11:48
Еще разница в том, что async возвращает Deferred, а launch возвращает Job.
ну это да, это я тоже прочекал когда читал, только как по мне показалось эти классы схожи по возможностям, функциям

Алексей
17.05.2018
07:17:02
А в чем разница job и deferred?

Я бы сам глянул, но нет возможности сейчас-.-

Жабра
17.05.2018
07:19:33
А в чем разница job и deferred?
Грубо говоря, Deferred - это обёртка над результатом. К примеру val def: Deferred<List<User>> = async { server.loadUsers() } val users: List<User> = def.await()

Алексей
17.05.2018
07:19:49
А job?

Anton
17.05.2018
07:21:03
deferred это фьючер

Жабра
17.05.2018
07:21:10
А job?
A Job это лишь состояние загрузки. val job: Job = launch { db.update(user) } job.join()

Алексей
17.05.2018
07:21:53
А, то есть job можно применить только чтобы спросить "эй, ты там всё?"

Алексей
17.05.2018
07:23:31
Ну тогда deferred это "ну чего у тебя там?"

Ясненько

Спасибо:)

Костя
17.05.2018
07:46:38
Можно сделать проще и без каналов. Примерно так: var task: Deferred<Unit>? = null fun startLoadOnScreen1() { task = async(UI) { doJob() } } fun waitForCompletionOnScreen2() { showProgress() launch(UI) { try { val result = task!!.await() showResult() } catch (e: Exception) { showError() } } }
а если у меня есть уже Deffered от ретрофита, как мне просто запустить его загрузку, await вызвать ? т.к. сервисы ретрофита возвращают Deffered я нашел специальный адаптер

Google
Roman
17.05.2018
07:51:31
Просто убрать async тогда.

Костя
17.05.2018
07:53:17
Просто убрать async тогда.
оО а запустить как ? таску

Roman
17.05.2018
07:54:20
Ну она сразу запустится. val task: Deferred<...> = retrofit.callSomeApi()

Костя
17.05.2018
07:54:38
серьезно ?

оО

Roman
17.05.2018
07:55:13
Ага. Не привычно после rx?)

Костя
17.05.2018
07:55:27
я думал это просто как get берешь типо, а без подписки не работает

очень пока )

но с другой стороны как Rx это если Lazy, тогда они работают как подпишешься

ну будешь ожидать ответа

а по умолчанию сразу запуск поидее

Жабра
17.05.2018
07:57:17
О, пока в тему: чё за ретрофит??

Roman
17.05.2018
07:57:24
У корутин есть тоже опция ленивого старта: val deferred = async(start = CoroutineStart.LAZY) { ... }

Костя
17.05.2018
07:57:53
вот это схоже с Rx

а по умолчанию сразу запуск даже если никт оне ждет )

Roman
17.05.2018
07:58:56
Да. В большинестве случев этого хватает. У меня только пара мест в приложении с ленивым запуском.

О, пока в тему: чё за ретрофит??
Популярная либа для запросов ко всяческим API.

Костя
17.05.2018
08:05:07
а сейчас вопрос больше по котлину, если в методе у меня есть лямбда, и внутри лямбды я присваиваю переменной значение другой переменной из метода(она определена выше), но у них совпадают имена, у переменной в лямбде и переменной методе, я могу ссылаться как-то в лямбде на переменную метода, как через this@MainActivity, но это ссылка на переменную глобальную, а мне бы на локальную как-то

Google
Костя
17.05.2018
08:08:14
пример: fun method() { val viewModel = ... val binding = ... .apply { viewModel = viewModel !?!?!? } }

вот

на глобальную можно сослаться через this@MainActivity

а в такой ситуации только давать им разные имена и всё ?

что мне не нравится (

Алексей
17.05.2018
08:10:41
Признаться, не понял

fun method() { val viewModel = ... val binding = let { … }.apply { viewModel = viewModel !?!?!? } }

Костя
17.05.2018
08:11:40
ну вопрос в том как в apply {} засеттанть viewModel property of binding мою viewModel определенную перед binding

Алексей
17.05.2018
08:11:44
Так должно быть?

Костя
17.05.2018
08:11:45
если имена их совпадают

не

дело внутри apply

вопрос

если я пишу viewModel = viewModel он получается сеттает себе свою же переменную что была

Алексей
17.05.2018
08:12:35
Да, придется или писать this@gg.viewModel, или давать иное имя вовне

Костя
17.05.2018
08:12:38
а мне нужно ту которая выше определена засеттать туда

значит сослаться на переменную метода нельзя

но спасибо, значит или разные имена или поле уровня класса

Алексей
17.05.2018
08:18:54
можно ещё посмотреть на also

Google
Алексей
17.05.2018
08:19:38
разница с apply в том, что receiver помечается не как this, а как it (то есть нет захвата контекста)

Stas
17.05.2018
08:32:44
Народ, подскажите, пжл, что-то туплю. Как красиво переписать выражение: value?.let { if (it.isTarget) { action() } } ?: action()

Alexey
17.05.2018
08:36:08
if (value?.isTarget() != false) { action() }

Костя
17.05.2018
08:37:37
Да. В большинестве случев этого хватает. У меня только пара мест в приложении с ленивым запуском.
нашел кстати нюанс в твоем решении, если запрос запущенный на первом экране отработал, и приходим на втором делаем await() то он запускается заного, я так понимаю это из-за того что результат запроса не держится нигде, и типо пока он работает, мы можем успеть await() и получим результат, а если он отрабатывает уже, await() dspsdftn только перезапуск, получается типо 2 раза запрос дергаем в некоторых ситуациях

Roman
17.05.2018
08:42:41
Нет, Deferred очень примитивный тип. Его нельзя запустить повторно и он имеет только два состояния: ожидание и результат. То есть если запрос один раз отработал, то можно сколько угодно раз вызывать await, первый раз он подождет выполнения, а все последующие будет возвращать результат сразу.

Gleb
17.05.2018
08:43:23
Deferred == Future

Stas
17.05.2018
08:48:14
Костя
17.05.2018
08:49:34
тут вопрос держит ли ретрофит уже созданные сервисы как-то или создает каждый раз и самому надо их держать

т.к. Deffered находится в сервисе

Roman
17.05.2018
08:51:07
Не, тут надо создать именно переменную task как я показал и ее ждать. Каждый вызов ретрофит апи создает запрос.

Я для этого создаю специальные классы, которые через DI пробрасываю интересующимся.

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

Костя
17.05.2018
08:53:12
понял, принял, сейчас сделаю проверю

точно, всё прошло, получается каждый вызов к сервису Retrofit == новый отдельный запрос

Artur
17.05.2018
09:04:56
Привет, есть такая штука <T : ScreenActionEvent> registerInternal(action: String, consumer: BiConsumer<Context, T>): пытаюсь передать в её такое: registerInternal<MainClickActionEvent?MainClickActionEvent.ACTION, { context, event -> и пишет что типы не может опознать(context, event) Как решить?

Artur
17.05.2018
09:07:15
да я пытался так сделать, но мне надо положить их в мапу и тут проблема

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