Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
guttaperchevyi
1 / 1 / 0
Регистрация: 15.02.2017
Сообщений: 24
1

Многопоточность Rx Java, туплю

18.11.2017, 15:05. Просмотров 867. Ответов 1
Метки нет (Все метки)

Что-то я туплю

Задача:
1) Обращаемся в базу данных и получаем первую пачку данных
2) Обрабатываем их и обращаемся в базу данных за другими данными
3) Обрабатываем их и отображаем всё в интерфейсе

То есть надо запустить первую функцию в новом потоке, потом вторую не в главном, потом третью,
а потом в главном потоке результат третьей функции отобразить.

Помогите, пожалуйста!

Допустим (типы и код я думаю не важны)
String func1();
int func2();
Date func3();
void DrawUI();

Как и куда вставить эти методы?
Допустим простой вызов Rx

Observable<String> myObservable = Observable.just("ok");

myObservable
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
new DisposableObserver<String>() {
@Override
public void onStart() { }
@Override
public void onComplete() {}
@Override
public void onNext(String str) {
DrawUI();
}
@Override
public void onError(Throwable e) {}
}
);
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2017, 15:05
Ответы с готовыми решениями:

Многопоточность
Подскажите плиз по многопоточности, как правильно работать с потоками? ...

Многопоточность в java
Добрый день. Появился вопрос по многопоточности: Есть 3 класса: public class...

Многопоточность Java
Помогите с заданием. В текстовом файле записаны слова (для простоты – в каждой...

Задача на многопоточность в Java
Есть задача, которая звучит примерно следующим образом: Есть класс...

Java Derby многопоточность
Всем привет. Кто сталкивался с derby, не могу понять вроде на сайте написано,...

1
demixdn
310 / 255 / 79
Регистрация: 31.10.2016
Сообщений: 619
20.11.2017, 13:19 2
Лучший ответ Сообщение было отмечено guttaperchevyi как решение

Решение

Вопрос: 2 задача зависит от результата выполнения первой?

Если да, то ваша цепочка должна выглядеть как-то так:
Java
1
2
3
4
5
Single<Date> dateSingle = Single.fromCallable(() -> func1())
                .map(s -> func2(s))
                .map(integer -> func3(integer))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
Дальше подписываемся на dateSingle и выполняем DrawUI или что там вам нужно сделать с результатом.


Если же все запросы независимы друг от друга, а вам нужно скомбинировать результаты выполнения этих запросов, то выглядит как-то так:
1. Подготавливаем Observable с нашими запросами
Java
1
2
Observable<String> func1Observable = Observable.fromCallable(() -> firstDBRequest());
Observable<String> func2Observable = Observable.fromCallable(() -> secondDBRequest());
2. Комбинируем их выполнение
Java
1
2
3
4
5
6
Observable<String> combineLatest = Observable.combineLatest(func1Observable, func2Observable, new BiFunction<String, String, String>() {
            @Override
            public String apply(String firstResult, String secondResult) throws Exception {
                return "Result combined [" + firstResult + ";" + secondResult + "]";
            }
        });
3. Указываем, в каких потоках выполнять и подписываемся на цепочку
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
combineLatest.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
        combineLatest.subscribe(new DefaultObserver<String>() {
            @Override
            public void onNext(String combinedResult) {
                saveResult(combinedResult);
            }
 
            @Override
            public void onError(Throwable e) {
 
            }
 
            @Override
            public void onComplete() {
                drawUI();
            }
        });

Во всех этих случаях не забывайте отписываться.

Добавлено через 27 минут
Если сокращенно записать второй результат, то будет так
Java
1
2
3
4
5
6
7
Observable<String> func1Observable = Observable.fromCallable(() -> firstDBRequest());
Observable<String> func2Observable = Observable.fromCallable(() -> secondDBRequest());
Observable<String> combineLatest = Observable.combineLatest(func1Observable, func2Observable, 
        (firstResult, secondResult) -> "Result combined [ " + firstResult + " ; " + secondResult + " ]");
combineLatest.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(combinedResult -> drawUI(combinedResult));
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2017, 13:19

Многопоточность. Java. Блокировка
Здравствуйте! Задание такое: есть автобусы(потоки), есть остановки,...

Многопоточность. Калькулятор. Java
Всем Привет. В теории я ознакомлен с многопоточностью, но не могу ее применить...

Многопоточность (Multithreading) в Java
Помогите пожалуйста разобраться с Multithreading в Java,а точнее с управлением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru