Страницы

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

четверг, 9 января 2020 г.

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

#android #rxjava #rxandroid #rxjava2


У меня есть 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?
    


Ответы

Ответ 1



Можно воспользоваться оператором 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))

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

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