Skip to content

Commit d4b04d8

Browse files
committed
Implemented publishLast
1 parent e0f57f1 commit d4b04d8

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import rx.plugins.RxJavaErrorHandler;
8484
import rx.plugins.RxJavaObservableExecutionHook;
8585
import rx.plugins.RxJavaPlugins;
86+
import rx.subjects.AsyncSubject;
8687
import rx.subjects.PublishSubject;
8788
import rx.subjects.ReplaySubject;
8889
import rx.subjects.Subject;
@@ -3634,6 +3635,14 @@ public ConnectableObservable<T> publish() {
36343635
return OperationMulticast.multicast(this, PublishSubject.<T> create());
36353636
}
36363637

3638+
/**
3639+
* Returns a {@link ConnectableObservable} that shares a single subscription that contains the last notification only.
3640+
* @return a {@link ConnectableObservable}
3641+
*/
3642+
public ConnectableObservable<T> publishLast() {
3643+
return OperationMulticast.multicast(this, AsyncSubject.<T> create());
3644+
}
3645+
36373646
/**
36383647
* Synonymous with <code>reduce()</code>.
36393648
* <p>

rxjava-core/src/test/java/rx/ObservableTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,48 @@ public void call(String v) {
487487
}
488488
}
489489

490+
@Test
491+
public void testPublishLast() throws InterruptedException {
492+
final AtomicInteger count = new AtomicInteger();
493+
ConnectableObservable<String> connectable = Observable.create(new OnSubscribeFunc<String>() {
494+
@Override
495+
public Subscription onSubscribe(final Observer<? super String> observer) {
496+
count.incrementAndGet();
497+
final BooleanSubscription subscription = new BooleanSubscription();
498+
new Thread(new Runnable() {
499+
@Override
500+
public void run() {
501+
observer.onNext("first");
502+
observer.onNext("last");
503+
observer.onCompleted();
504+
}
505+
}).start();
506+
return subscription;
507+
}
508+
}).publishLast();
509+
510+
// subscribe once
511+
final CountDownLatch latch = new CountDownLatch(1);
512+
connectable.subscribe(new Action1<String>() {
513+
@Override
514+
public void call(String value) {
515+
assertEquals("last", value);
516+
latch.countDown();
517+
}
518+
});
519+
520+
// subscribe twice
521+
connectable.subscribe(new Action1<String>() {
522+
@Override
523+
public void call(String _) {}
524+
});
525+
526+
Subscription subscription = connectable.connect();
527+
assertTrue(latch.await(1000, TimeUnit.MILLISECONDS));
528+
assertEquals(1, count.get());
529+
subscription.unsubscribe();
530+
}
531+
490532
@Test
491533
public void testReplay() throws InterruptedException {
492534
final AtomicInteger counter = new AtomicInteger();

0 commit comments

Comments
 (0)