0

Learning RxJava so will be appreciate for any advice.

Need to receive objects when calculation is ready, so I made PublishSubject in models method:

public PublishSubject<BaseUnit> exec(int inputNumber) {

    if (unitList.size() > 0) {
        for (BaseUnit unit : unitList) {
            unit.setInProgress();
        }
    }

    PublishSubject<BaseUnit> subject = PublishSubject.create();

    list = new ArrayList<>();

    populateList(inputNumber).
            subscribeOn(Schedulers.from(Executors.newFixedThreadPool(ThreadPool.getPoolSize())))
            .subscribe(calculatedList -> {
                list = calculatedList;

                for (List<Integer> elem : list) {
                    for (ListOperationName operationName : ListOperationName.values()) {
                        ListUnit unit = new ListUnit(operationName, elem, 0);
                        calculate(unit);
                        unitList.add(unit);
                        subject.onNext(unit);
                    }
                }

            }, error -> Log.d("ERROR", error.toString()));

    return subject;
}


public Observable<ArrayList<List<Integer>>> populateList(int inputNumber) {
    return Observable.fromCallable(() -> {

        ArrayList<List<Integer>> list = new ArrayList<>();

        Integer[] populatedArray = new Integer[inputNumber];
        Arrays.fill(populatedArray, insertValue);

        list.add(new ArrayList<>(Arrays.asList(populatedArray)));
        list.add(new LinkedList<>(Arrays.asList(populatedArray)));
        list.add(new CopyOnWriteArrayList<>(Arrays.asList(populatedArray)));

        return list;
    });
}

And then trying to subscribe in presenter:

public void calculate(int inputNumber) {

    fragment.showAllProgressBars();

    repository.exec(inputNumber)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.from(Executors.newFixedThreadPool(ThreadPool.getPoolSize())))
            .subscribe(unit -> {
                Log.d("PRESENTER RESULT", unit.toString());
                fragment.setCellText(unit.getViewId(), unit.getTimeString());

            }, error -> Log.d("PRESENTER ERROR", error.toString()));
}

This gives me nothing. But if I use ReplaySubject - it gives me all results, but seems like it uses only one thread. So I assume there is somethings wrong I made with subscription and it should be somewhere earlier. I need to use exactly PublishSubject for giving me results as they are ready using multiple threads.

How to fix that? Or maybe there is other problem?

white-imp
  • 313
  • 2
  • 16
  • what do you mean by `I need to use exactly PublishSubject for giving me results as they are ready using multiple threads.`? – Blackbelt Jul 09 '20 at 14:55
  • I mean I need to subscribe before subject.onNext() so subject starts giving me results after subscribe. – white-imp Jul 09 '20 at 14:57
  • 1
    why don't you use BehaviourSubject? If the consumer is late it will get at least the last value emitted. Conversely, you could execute the `populateList(inputNumber).....` bit on the `doOnSubscribe {}` – Blackbelt Jul 09 '20 at 15:00
  • @Blackbelt I need all results, not the last one, so Behavior doesn't mathc. What do you mean "doOnSubscribe"? Do you suggest to use Observer to subscribe my "populateList" method? – white-imp Jul 09 '20 at 15:05
  • with last value I mean last value observed (last value you passed to `onNext`) – Blackbelt Jul 09 '20 at 15:08
  • I need all results so they will be displayed by portions according to device cores amount. – white-imp Jul 09 '20 at 15:41
  • @Blackbelt observer.doOnNext works for me, thanks for idea. – white-imp Jul 09 '20 at 16:47

0 Answers0