Skip to content

Commit c240b93

Browse files
author
Kaushik Gopal
committed
feat: port pagination + bus examples fix: no null returns
* port example Pagination with Rx (using Subjects) * port example RxBus : event bus using RxJava (using RxRelay (never terminating Subjects) and debouncedBuffer) * Observables don't allow returning null anymore
1 parent 5585bba commit c240b93

File tree

7 files changed

+124
-125
lines changed

7 files changed

+124
-125
lines changed

app/src/main/java/com/morihacky/android/rxjava/MyApp.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.morihacky.android.rxjava;
22

33
import android.app.Application;
4-
54
import com.morihacky.android.rxjava.volley.MyVolley;
65
import com.squareup.leakcanary.LeakCanary;
76
import com.squareup.leakcanary.RefWatcher;
@@ -28,6 +27,9 @@ public void onCreate() {
2827
_instance = (MyApp) getApplicationContext();
2928
_refWatcher = LeakCanary.install(this);
3029

30+
// for better RxJava debugging
31+
//RxJavaHooks.enableAssemblyTracking();
32+
3133
// Initialize Volley
3234
MyVolley.init(this);
3335

app/src/main/java/com/morihacky/android/rxjava/pagination/PaginationAutoFragment.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
import com.morihacky.android.rxjava.R;
1515
import com.morihacky.android.rxjava.fragments.BaseFragment;
1616
import com.morihacky.android.rxjava.rxbus.RxBus;
17+
import io.reactivex.Flowable;
18+
import io.reactivex.android.schedulers.AndroidSchedulers;
19+
import io.reactivex.disposables.CompositeDisposable;
20+
import io.reactivex.disposables.Disposable;
21+
import io.reactivex.processors.PublishProcessor;
1722
import java.util.ArrayList;
1823
import java.util.List;
1924
import java.util.concurrent.TimeUnit;
20-
import rx.Observable;
21-
import rx.Subscription;
22-
import rx.android.schedulers.AndroidSchedulers;
23-
import rx.subjects.PublishSubject;
24-
import rx.subscriptions.CompositeSubscription;
2525

2626
public class PaginationAutoFragment
2727
extends BaseFragment {
@@ -31,9 +31,9 @@ public class PaginationAutoFragment
3131

3232
private PaginationAutoAdapter _adapter;
3333
private RxBus _bus;
34-
private PublishSubject<Integer> _paginator;
34+
private CompositeDisposable _disposables;
35+
private PublishProcessor<Integer> _paginator;
3536
private boolean _requestUnderWay = false;
36-
private CompositeSubscription _subscriptions;
3737

3838
@Override
3939
public View onCreateView(LayoutInflater inflater,
@@ -57,15 +57,15 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
5757
_adapter = new PaginationAutoAdapter(_bus);
5858
_pagingList.setAdapter(_adapter);
5959

60-
_paginator = PublishSubject.create();
60+
_paginator = PublishProcessor.create();
6161
}
6262

6363
@Override
6464
public void onStart() {
6565
super.onStart();
66-
_subscriptions = new CompositeSubscription();
66+
_disposables = new CompositeDisposable();
6767

68-
Subscription s2 = _paginator
68+
Disposable d2 = _paginator
6969
.onBackpressureDrop()
7070
.doOnNext(i -> {
7171
_requestUnderWay = true;
@@ -76,7 +76,8 @@ public void onStart() {
7676
.map(items -> {
7777
_adapter.addItems(items);
7878
_adapter.notifyDataSetChanged();
79-
return null;
79+
80+
return items;
8081
})
8182
.doOnNext(i -> {
8283
_requestUnderWay = false;
@@ -86,8 +87,9 @@ public void onStart() {
8687

8788
// I'm using an RxBus purely to hear from a nested button click
8889
// we don't really need Rx for this part. it's just easy ¯\_(ツ)_/¯
89-
Subscription s1 = _bus
90-
.asObservable()
90+
91+
Disposable d1 = _bus
92+
.asFlowable()
9193
.filter(o -> !_requestUnderWay)
9294
.subscribe(event -> {
9395
if (event instanceof PaginationAutoAdapter.PageEvent) {
@@ -98,23 +100,23 @@ public void onStart() {
98100
}
99101
});
100102

101-
_subscriptions.add(s1);
102-
_subscriptions.add(s2);
103+
_disposables.add(d1);
104+
_disposables.add(d2);
103105

104106
_paginator.onNext(0);
105107
}
106108

107109
@Override
108110
public void onStop() {
109111
super.onStop();
110-
_subscriptions.clear();
112+
_disposables.clear();
111113
}
112114

113115
/**
114116
* Fake Observable that simulates a network call and then sends down a list of items
115117
*/
116-
private Observable<List<String>> _itemsFromNetworkCall(int pageStart) {
117-
return Observable
118+
private Flowable<List<String>> _itemsFromNetworkCall(int pageStart) {
119+
return Flowable
118120
.just(true)
119121
.observeOn(AndroidSchedulers.mainThread())
120122
.delay(2, TimeUnit.SECONDS)

app/src/main/java/com/morihacky/android/rxjava/pagination/PaginationFragment.java

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,30 @@
88
import android.view.View;
99
import android.view.ViewGroup;
1010
import android.widget.ProgressBar;
11-
11+
import butterknife.Bind;
12+
import butterknife.ButterKnife;
1213
import com.morihacky.android.rxjava.MainActivity;
1314
import com.morihacky.android.rxjava.R;
1415
import com.morihacky.android.rxjava.fragments.BaseFragment;
1516
import com.morihacky.android.rxjava.rxbus.RxBus;
16-
17+
import io.reactivex.Flowable;
18+
import io.reactivex.android.schedulers.AndroidSchedulers;
19+
import io.reactivex.disposables.CompositeDisposable;
20+
import io.reactivex.disposables.Disposable;
21+
import io.reactivex.processors.PublishProcessor;
1722
import java.util.ArrayList;
1823
import java.util.List;
1924
import java.util.concurrent.TimeUnit;
2025

21-
import butterknife.Bind;
22-
import butterknife.ButterKnife;
23-
import rx.Observable;
24-
import rx.Subscription;
25-
import rx.android.schedulers.AndroidSchedulers;
26-
import rx.subjects.PublishSubject;
27-
import rx.subscriptions.CompositeSubscription;
28-
29-
public class PaginationFragment extends BaseFragment {
26+
public class PaginationFragment
27+
extends BaseFragment {
3028

3129
@Bind(R.id.list_paging) RecyclerView _pagingList;
3230
@Bind(R.id.progress_paging) ProgressBar _progressBar;
33-
34-
private CompositeSubscription _subscriptions;
3531
private PaginationAdapter _adapter;
3632
private RxBus _bus;
37-
private PublishSubject<Integer> _paginator;
33+
private CompositeDisposable _disposables;
34+
private PublishProcessor<Integer> _paginator;
3835

3936
@Override
4037
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
@@ -49,56 +46,60 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
4946
_adapter = new PaginationAdapter(_bus);
5047
_pagingList.setAdapter(_adapter);
5148

52-
_paginator = PublishSubject.create();
49+
_paginator = PublishProcessor.create();
5350
}
5451

5552
@Override
5653
public void onStart() {
5754
super.onStart();
58-
_subscriptions = new CompositeSubscription();
55+
_disposables = new CompositeDisposable();
5956

60-
Subscription s2 =//
61-
_paginator//
62-
.onBackpressureDrop()//
63-
.concatMap(nextPage -> _itemsFromNetworkCall(nextPage + 1, 10))//
64-
.observeOn(AndroidSchedulers.mainThread()).map(items -> {
57+
Disposable d2 = _paginator
58+
.onBackpressureDrop()
59+
.concatMap(nextPage -> _itemsFromNetworkCall(nextPage + 1, 10))
60+
.observeOn(AndroidSchedulers.mainThread())
61+
.map(items -> {
6562
int start = _adapter.getItemCount() - 1;
6663

6764
_adapter.addItems(items);
6865
_adapter.notifyItemRangeInserted(start, 10);
6966

7067
_progressBar.setVisibility(View.INVISIBLE);
71-
return null;
72-
})//
73-
.subscribe();
68+
69+
return items;
70+
})
71+
.subscribe();
7472

7573
// I'm using an Rxbus purely to hear from a nested button click
7674
// we don't really need Rx for this part. it's just easy ¯\_(ツ)_/¯
77-
Subscription s1 = _bus.asObservable().subscribe(event -> {
78-
if (event instanceof PaginationAdapter.ItemBtnViewHolder.PageEvent) {
75+
Disposable d1 = _bus
76+
.asFlowable()
77+
.subscribe(event -> {
78+
if (event instanceof PaginationAdapter.ItemBtnViewHolder.PageEvent) {
7979

80-
// trigger the paginator for the next event
81-
int nextPage = _adapter.getItemCount() - 1;
82-
_paginator.onNext(nextPage);
80+
// trigger the paginator for the next event
81+
int nextPage = _adapter.getItemCount() - 1;
82+
_paginator.onNext(nextPage);
8383

84-
}
85-
});
84+
}
85+
});
8686

87-
_subscriptions.add(s1);
88-
_subscriptions.add(s2);
87+
_disposables.add(d1);
88+
_disposables.add(d2);
8989
}
9090

9191
@Override
9292
public void onStop() {
9393
super.onStop();
94-
_subscriptions.clear();
94+
_disposables.clear();
9595
}
9696

9797
/**
9898
* Fake Observable that simulates a network call and then sends down a list of items
9999
*/
100-
private Observable<List<String>> _itemsFromNetworkCall(int start, int count) {
101-
return Observable.just(true)
100+
private Flowable<List<String>> _itemsFromNetworkCall(int start, int count) {
101+
return Flowable
102+
.just(true)
102103
.observeOn(AndroidSchedulers.mainThread())
103104
.doOnNext(dummy -> _progressBar.setVisibility(View.VISIBLE))
104105
.delay(2, TimeUnit.SECONDS)
@@ -111,7 +112,6 @@ private Observable<List<String>> _itemsFromNetworkCall(int start, int count) {
111112
});
112113
}
113114

114-
115115
// -----------------------------------------------------------------------------------
116116
// WIRING up the views required for this example
117117

@@ -123,6 +123,4 @@ public View onCreateView(LayoutInflater inflater,
123123
ButterKnife.bind(this, layout);
124124
return layout;
125125
}
126-
127-
128126
}

app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBus.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.jakewharton.rxrelay.PublishRelay;
44
import com.jakewharton.rxrelay.Relay;
5-
6-
import rx.Observable;
5+
import hu.akarnokd.rxjava.interop.RxJavaInterop;
6+
import io.reactivex.Flowable;
77

88
/**
99
* courtesy: https://gist.github.com/benjchristensen/04eef9ca0851f3a5d7bf
@@ -16,8 +16,9 @@ public void send(Object o) {
1616
_bus.call(o);
1717
}
1818

19-
public Observable<Object> asObservable() {
20-
return _bus.asObservable();
19+
public Flowable<Object> asFlowable() {
20+
// this won't be necessary after https://github.com/JakeWharton/RxRelay/pull/20 is complete
21+
return RxJavaInterop.toV2Flowable(_bus.asObservable());
2122
}
2223

2324
public boolean hasObservers() {

app/src/main/java/com/morihacky/android/rxjava/rxbus/RxBusDemo_Bottom1Fragment.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,19 @@
77
import android.view.View;
88
import android.view.ViewGroup;
99
import android.widget.TextView;
10-
10+
import butterknife.Bind;
11+
import butterknife.ButterKnife;
1112
import com.morihacky.android.rxjava.MainActivity;
1213
import com.morihacky.android.rxjava.R;
1314
import com.morihacky.android.rxjava.fragments.BaseFragment;
14-
15-
import butterknife.Bind;
16-
import butterknife.ButterKnife;
17-
import rx.subscriptions.CompositeSubscription;
15+
import io.reactivex.disposables.CompositeDisposable;
1816

1917
public class RxBusDemo_Bottom1Fragment
2018
extends BaseFragment {
2119

2220
@Bind(R.id.demo_rxbus_tap_txt) TextView _tapEventTxtShow;
21+
private CompositeDisposable _disposables;
2322
private RxBus _rxBus;
24-
private CompositeSubscription _subscriptions;
2523

2624
@Override
2725
public View onCreateView(LayoutInflater inflater,
@@ -41,26 +39,29 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
4139
@Override
4240
public void onStart() {
4341
super.onStart();
44-
_subscriptions = new CompositeSubscription();
42+
_disposables = new CompositeDisposable();
4543

46-
_subscriptions//
47-
.add(_rxBus.asObservable()//
48-
.subscribe(event -> {
49-
if (event instanceof RxBusDemoFragment.TapEvent) {
50-
_showTapText();
51-
}
52-
}));
44+
_disposables.add(_rxBus
45+
.asFlowable()
46+
.subscribe(event -> {
47+
if (event instanceof RxBusDemoFragment.TapEvent) {
48+
_showTapText();
49+
}
50+
}));
5351
}
5452

5553
@Override
5654
public void onStop() {
5755
super.onStop();
58-
_subscriptions.clear();
56+
_disposables.clear();
5957
}
6058

6159
private void _showTapText() {
6260
_tapEventTxtShow.setVisibility(View.VISIBLE);
6361
_tapEventTxtShow.setAlpha(1f);
64-
ViewCompat.animate(_tapEventTxtShow).alphaBy(-1f).setDuration(400);
62+
ViewCompat
63+
.animate(_tapEventTxtShow)
64+
.alphaBy(-1f)
65+
.setDuration(400);
6566
}
6667
}

0 commit comments

Comments
 (0)