mardi 14 juin 2016

RxJava map and emit as soon as a single map completed

I want to map/convert an object to another object in background thread and have it on main thread as soon as a single conversation is completed.

Observable.just(1,2,3,4,5)
            .map(new Func1<Integer, String>() {
                @Override
                public String call(Integer integer) {
                    Log.d(TAG, "mapping number " + integer);
                    return String.valueOf(integer) + " mapped on: " + Thread.currentThread().getName();
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {
                    Log.d(TAG, "onCompleted on: " + Thread.currentThread().getName());
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(String integer) {
                    Log.d(TAG, integer + " received on: "+ Thread.currentThread().getName());
                }
            });

The Result is:

D: mapping number 1
D: mapping number 2
D: mapping number 3
D: mapping number 4
D: mapping number 5
D: 1 mapped on: RxNewThreadScheduler-1 received on: main
D: 2 mapped on: RxNewThreadScheduler-1 received on: main
D: 3 mapped on: RxNewThreadScheduler-1 received on: main
D: 4 mapped on: RxNewThreadScheduler-1 received on: main
D: 5 mapped on: RxNewThreadScheduler-1 received on: main
D: onCompleted on: main

However the conversion may took a while and I expect to receive them as soon as the conversion is done.

D: mapping number 1
D: 1 mapped on: RxNewThreadScheduler-1 received on: main
D: mapping number 2
D: 2 mapped on: RxNewThreadScheduler-1 received on: main
D: mapping number 3
D: 3 mapped on: RxNewThreadScheduler-1 received on: main
D: mapping number 4
D: 4 mapped on: RxNewThreadScheduler-1 received on: main
D: mapping number 5
D: 5 mapped on: RxNewThreadScheduler-1 received on: main
D: onCompleted on: main

Aucun commentaire:

Enregistrer un commentaire