Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Oct 20 2016 21:50
    @rus-speaking banned @ImangazalievM
  • Oct 12 2016 11:37
    @rus-speaking banned @postflow
  • Aug 16 2016 15:49
    @rus-speaking banned @BOINCROSETTAHOMEIMMORTALITY
  • Jan 31 2016 12:15
    @rus-speaking banned @Nikkola
  • Dec 01 2015 16:39
    @rus-speaking banned @StNekroman
  • Nov 15 2015 20:36
    User @rus-speaking unbanned @skilz2012 from this room
  • Nov 11 2015 12:31
    @rus-speaking banned @skilz2012
Eugene Popovich
@httpdispatch
Легче всего использовать subject
или напрямую RxView.clicks()
Nick Unuchek
@Kolyall
это я пример написал что isActivated меняется при помощи метода... но наверн буду через subject менять
Eugene Popovich
@httpdispatch
RxView.clicks()
.subscribe(__ -> mRetrofit.sendRequest())
moonsweel
@moonsweel
@Kolyall через repeatWhen можно, без сабжектов
Nick Unuchek
@Kolyall
@moonsweel
типо так?
boolean isActivated = false;
        Observable.just(isActivated)
                .filter(aBoolean -> isActivated)
                .flatMap(aBoolean -> mRetrofit.sendRequest())
                .repeatWhen(observable -> Observable.just(isActivated)
                                                    .filter(aBoolean -> aBoolean)
                )
                .subscribe();
Eugene Popovich
@httpdispatch
Так оно не будет работать
Observable.just выполняется моментально
а не будет слушать, когда вы поменяете булевое значение
Nick Unuchek
@Kolyall
а аа нужен OBservable.interval
Eugene Popovich
@httpdispatch
это лишнее
нужно просто использовать триггер
subject или observable
Nick Unuchek
@Kolyall
PublishSubject<Boolean> subject = PublishSubject .create();
boolean isActivated = false;
        Observable.just(isActivated)
                .filter(aBoolean -> isActivated)
                .flatMap(aBoolean -> mRetrofit.sendRequest())
                .repeatWhen(observable -> subject .asObservable()
                                                    .filter(aBoolean -> aBoolean)
                )
                .subscribe();
и отправлять subject.onNext(isActivated);
так?
Eugene Popovich
@httpdispatch
почти, только проще надо
PublishSubject<Boolean> subject = PublishSubject .create();
subject.filter(value -> value)
.flatMap(aBoolean -> mRetrofit.sendRequest())
Akbolat Sadvakassov
@iRYO400
Что голова совсем уже не варит. Скиньте плз, пример привязки на кнопку с помощью RxBinding 2( именно два, где не Action1, а Consumer'ы)
СпасибО!
DenisZhigalo
@DenisZhigalo
Привет! В общем случае есть запрос, который возвращает ок/ошибку, затем в switchMap нужно произвести действия и вернуть результат. Но если запрос возвращает ошибку, то блок switchMap все равно выполняется. Кто пояснит что делаю не так?
DenisZhigalo
@DenisZhigalo
public Observable<Boolean> logout() {
        return loginApi.logout()
                .switchMap(e -> Observable.create(o -> {
                    o.onNext(true);
                    o.onComplete();
                }));
    }
Eugene Popovich
@httpdispatch
@DenisZhigalo а как запрос возвращает ошибку, в виде исключения?
DenisZhigalo
@DenisZhigalo
@httpdispatch извини. я совсем слоупок - был на другом проекте. да, выбрасывается исключение, затем в onError оно проверяется и кастится к HttpException, откуда берется body с сообщением ошибки
Eugene Popovich
@httpdispatch
@DenisZhigalo нужно больше кода
DenisZhigalo
@DenisZhigalo
@httpdispatch вот пример схожего кейса: в сервисе метод с запросом на добавление/редактирование закладки, затем получение и возврат списка всех закладок этой книги
public Observable<List<Bookmark>> addBookmark(NewBookmark newBookmark) {
    return bookmarkApi.addBookmark(newBookmark)
        .switchMap(m -> bookmarkApi.getBookmarks(newBookmark.getBookId()));
}
вызов метода из презентора
addDisposable(bookmarkService.addBookmark(new NewBookmark(bookId, page, name))
    .compose(NetRx.applyNetSchedulers())
    .subscribe(this::loadBookmarksComplete, this::onApiError));
ситуация следующая: запрос на добавление закладки возвращает ошибку, затем выполнятся запрос всех закладок и весь список возвращается в ui. Не могу понять почему в случае ошибки блок switchMap все равно выполняется
Eugene Popovich
@httpdispatch
А если поставить doOnError перед switchMap - он будет вызываться? Каким образом запрос возвращает ошибку? Попробуйте использовать result из retrofit
DenisZhigalo
@DenisZhigalo
Спасибо! Разобрался, это я тупил.
@POST("bookmark")
Observable<Response<Void>> addBookmark(@Body NewBookmark newBookmark);
Response<Void> вернется в любом случае, будь то ошибка или ок
Eugene Popovich
@httpdispatch
@DenisZhigalo Result будет удобнее использовать
Akbolat Sadvakassov
@iRYO400
Ребзя, что кроме непосредственного Observable.create() посоветуете? Часто видел замечание в туториалах, что лучше избегать такого прямого вызова
Сергей Узенев
@ostoperla_twitter
@iRYO400 вроде как в RxJava 2 это поправили
Akbolat Sadvakassov
@iRYO400
Подскажите, есть 3 Singl'a разных типов, как можно их объединить в последовательный вызов? *но не с общим типом
Eugene Popovich
@httpdispatch
@iRYO400 Observable.concat
Fyodor Sherstobitov
@fsherstobitov

Всем привет!
Не могу разобраться, почему код работает не так, как я думаю. Вот код:

    override fun syncFolderJobs(): Completable {
        return api.folderJobs(prefs.deviceId().toString())
            .flatMapObservable { folderJobDtos -> Observable.fromIterable(folderJobDtos) }
            .flatMapCompletable { dto -> saveFolderJob(dto) }
    }

    private fun saveFolderJob(dto: FolderJobDto?) = Completable.fromAction {
        if (dto != null) {
            val job = folderJobMapper.dtoToEntity(dto)
            val workOrderId = job.workOrderId
            if (workOrderId != null) {
                val savedJob = folderJobDao.findByWorkOrderIdSync(workOrderId)
                if (savedJob != null) {
                    folderJobDao.update(job)
                } else {
                    folderJobDao.insert(job)
                }
            }
        }
    }.andThen { saveBarcodeReads(dto) }

    private fun saveBarcodeReads(dto: FolderJobDto?) = Completable.fromAction {
        val workOrderId = dto?.workOrderId
        val barcodeReadDtos = dto?.barcodeReads
        if (workOrderId != null && barcodeReadDtos != null && !barcodeReadDtos.isEmpty()) {
            val savedBarcodeReads = barcodeReadDao.findByWorkOrderIdSync(workOrderId)
            val newBarcodeReads = barcodeReadMapper.dtoListToEntityList(barcodeReadDtos)
            barcodeReadDao.insertAll(newBarcodeReads.minus(savedBarcodeReads))
        }
    }

Вот тест для этого кода:

    @Test
    fun testSimpleSync() {
        val url = loadResource("folder_jobs.json")

        val objectMapper = ObjectMapper()
        val type = objectMapper.typeFactory.constructCollectionLikeType(List::class.java,
                FolderJobDto::class.java)
        val folderJobs = objectMapper.readValue<List<FolderJobDto>>(url, type)

        val deviceId = UUID.randomUUID()

        whenever(prefs.deviceId()).thenReturn(UUID.fromString(deviceId))
        whenever(api.folderJobs(deviceId.toLowerCase())).thenReturn(Single.just(folderJobs))
        whenever(folderJobDao.findByWorkOrderIdSync(any())).thenReturn(null)
        whenever(barcodeReadDao.findByWorkOrderIdSync(any())).thenReturn(emptyList())

        val service = OrbFolderJobService(folderJobDao, barcodeReadDao, api, folderJobMapper,
                barcodeReadMapper, prefs)
        val testObserver = service.syncFolderJobs().test()

        testObserver.assertComplete()
        verify(prefs).deviceId()
        verify(api).folderJobs(deviceId.toLowerCase())
        verify(folderJobDao, times(folderJobs.size)).findByWorkOrderIdSync(any())
        verify(folderJobDao, times(folderJobs.size)).insert(any())
        verify(barcodeReadDao, times(folderJobs.size)).findByWorkOrderIdSync(any())
        verify(barcodeReadDao, times(folderJobs.size)).insertAll(any())
    }

Тест падает на строке testObserver.assertComplete(). Дебагером ходил по коду - нигде никаких эксепшенов не вылеает. В чем может быть проблема?

Eugene Popovich
@httpdispatch
@fsherstobitov А там нет переключения потоков нигде внутри update insert?
Fyodor Sherstobitov
@fsherstobitov
нет
я нашел проблему. andThen надо вызывать не в форме лямбды, а в форме функции, т.к. в первом случае все, что внутри лямбды является Completable, а во втором будет выполнен Completable, который возвращается при вызове функции saveBarcodeReads
т.е. мне нужно было написать .andThen(saveBarcodeReads())- и так все заработало
Toporik
@Toporik
Привет! А можно написать Observable так чтобы от эммитил данные только последнему подписавшемуся?
xomyc
@xomyc
Всем привет. У меня есть в приложении Observable которая проверяет нет ли измененний в определенных данных, если есть выполняет сетевой запрос, отправяля их на сервак. При этом инициализироваться эта проверка может из разных мест и сама проверка занимает определенное время, выполняясь на отдельном потоке. Нужно гарантировать что если во время одной проверки вызвалась вторая, то вторая не начнет выполнятся раньше первой. То же самое для третьей, пятой, десятой. Есть какой-то красивый способ сделать это? Я пока только всякие костыли придумал :(
MayyaLitvina
@MayyaLitvina

Senior / Middle Android-разработчик (Москва)
190 000 руб.

О ПРОЕКТЕ:
Наш сервис позволяет пользователю осуществить свою материальную мечту и наблюдать за этим в режиме реального времени

ОБЯЗАННОСТИ:
Доработка и поддержка мобильного клиент-серверного приложения и внедрение новых функций
Адаптация приложения под различные форматы устройств.

ВАШ ОПЫТ:
Опыт коммерческой разработки от 2-х лет и знание специфики разработки под разные версии Android (версии 4 и выше).
Уметь верстать интерфейсы и создавать интерфейсные анимации.
Знание библиотек Retrofit 2, RxJava (желателен), Dagger 2. Realm.
Желательно опыт работы с sdk соц сетей.

ЧТО ПРЕДЛАГАЕМ:
5/2, гибкий рабочий день (8 часов), метро «Трубная» и «Цветной бульвар».
возможность поучаствовать в интересном и перспективном проекте.

ДЕТАЛИ тут: https://bit.ly/2Op09L6
Контакты: tanyazaj@gmail.com

Adverte
@Adverte
@xomyc закидываешь в очередь, выполняешь по одной. Самое простое, повесить synchronized на метод который выполняет проверку (он же у тебя один для всех? )) так?)
@xomyc для оперативности в телеграм ещё кидай вопросы, оперативно помогают https://t.me/androidev или @androidev
karthik9052
@karthik9052
Hi
Anybody knows library for family tree in Android studio