Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Как правильно заменить AsyncTask с помощью RxJava2 и RxAndroid2

У меня есть AsyncTask, который я хочу переделать в Rx
Вот так выглядит мой AsyncTask
new AsyncTask() { ArrayList undoneServiceCodes = new ArrayList<>(); HashMap undoneForms = new HashMap<>(); boolean isHasAtLeastOneDoneServiceCode = false;
@Override protected void onPreExecute() { super.onPreExecute();
if (iCloseCallListener != null) { iCloseCallListener.onPreValidation(); } }
@Override protected Void doInBackground(Void... params) { undoneServiceCodes = getUndoneServiceCodes(); undoneForms = getUndoneForms(); isHasAtLeastOneDoneServiceCode = isHasAtLeastOneDoneServiceCode();
return null; }
@Override protected void onPostExecute(Void iVoid) { super.onPostExecute(iVoid);
if (iCloseCallListener != null) { iCloseCallListener.onPostValidation(undoneServiceCodes, undoneForms, isHasAtLeastOneDoneServiceCode); } } }.execute();
Мне не понятно как можно выполнить в бекграунде Rx , можно выполнить сразу 3 разных метода как в примере с AsyncTask когда в бекграунде выполняется 3 метода
undoneServiceCodes = getUndoneServiceCodes(); undoneForms = getUndoneForms(); isHasAtLeastOneDoneServiceCode = isHasAtLeastOneDoneServiceCode();
Если это был бы один метод(допустим первый) я бы это сделал так
Flowable.fromIterable(getUndoneServiceCodes())// .subscribeOn(Schedulers.io())// .observeOn(AndroidSchedulers.mainThread())// .doOnSubscribe(iSubscription -> { if (iCloseCallListener != null) { iCloseCallListener.onPreValidation(); } }).toList()// .subscribe(resultList -> { if (iCloseCallListener != null) { iCloseCallListener.onPostValidation(iCloseCallListener, ???, ???); } });
Но так я получу результат только для одного выполняемого в бекграунде метода, как сделать так, чтоб можно было обрабоать 3?


Ответ

Можно воспользоваться оператором zip как-то так (точность названий методов не гарантирую):
Flowable.zip( Flowable.fromCallable(method1()), Flowable.fromCallable(method2()), Flowable.fromCallable(method3()), (result1, result2, result3) -> new Triple(result1, result2, result3) ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(triple -> iCloseCallListener.onPostValidation(triple.first, triple.second, triple.third))

Комментариев нет:

Отправить комментарий