1010import android .view .View ;
1111import android .view .ViewGroup ;
1212import android .widget .ArrayAdapter ;
13+ import android .widget .Button ;
1314import android .widget .ListView ;
1415
1516import com .morihacky .android .rxjava .app .R ;
2021
2122import butterknife .ButterKnife ;
2223import butterknife .InjectView ;
23- import butterknife .OnClick ;
2424import rx .Observable ;
2525import rx .Observer ;
2626import rx .Subscriber ;
27+ import rx .Subscription ;
2728import rx .android .schedulers .AndroidSchedulers ;
2829import rx .schedulers .Schedulers ;
2930import timber .log .Timber ;
3031
32+ /**
33+ * credit to @tomrozb for this implementation:
34+ * http://stackoverflow.com/questions/24922610/incorrect-understanding-of-buffer-in-rxjava
35+ *
36+ * An alternate mechanism of achieving the same result would be to use a {@link rx.subjects.PublishSubject}
37+ * as demonstrated in the case of {@link com.morihacky.android.rxjava.SubjectDebounceSearchEmitterFragment}
38+ */
3139public class BufferDemoFragment
3240 extends Fragment {
3341
3442 @ InjectView (R .id .list_threading_log ) ListView _logsList ;
43+ @ InjectView (R .id .btn_start_operation ) Button _tapBtn ;
3544
3645 private LogAdapter _adapter ;
3746 private List <String > _logs ;
3847 private int _tapCount = 0 ;
3948
40- private Observable <List <Integer >> _bufferedObservable ;
41- private Observer <List <Integer >> _observer ;
49+ private Subscription _subscription ;
4250
4351 @ Override
44- public void onActivityCreated (@ Nullable Bundle savedInstanceState ) {
45- super .onActivityCreated (savedInstanceState );
46- _setupLogger ();
47-
48- _bufferedObservable = _getBufferedObservable ();
49- _observer = _getObserver ();
52+ public void onResume () {
53+ super .onResume ();
54+ _subscription = _getBufferedObservable ().subscribe (_getObserver ());
5055 }
5156
52-
53- @ OnClick (R .id .btn_start_operation )
54- public void onButtonTapped () {
55- Timber .d ("--------- GOT A TAP" );
56- _tapCount += 1 ;
57- _log ("GOT A TAP" );
58- _bufferedObservable .subscribeOn (Schedulers .io ())
59- .observeOn (AndroidSchedulers .mainThread ())
60- .subscribe (_observer );
57+ @ Override
58+ public void onPause () {
59+ super .onPause ();
60+ _subscription .unsubscribe ();
6161 }
6262
6363 // -----------------------------------------------------------------------------------
6464 // Main Rx entities
6565
6666 private Observable <List <Integer >> _getBufferedObservable () {
67+
6768 return Observable .create (new Observable .OnSubscribe <Integer >() {
6869
6970
7071 @ Override
7172 public void call (Subscriber <? super Integer > subscriber ) {
72- subscriber .onNext (1 );
73- }
73+ _tapBtn .setOnClickListener (new View .OnClickListener () {
7474
75- }).buffer (2 , TimeUnit .SECONDS );
75+
76+ @ Override
77+ public void onClick (View v ) {
78+ Timber .d ("--------- GOT A TAP" );
79+ _tapCount += 1 ;
80+ _log ("GOT A TAP" );
81+ }
82+ });
83+ }
84+ })
85+ .buffer (2 , TimeUnit .SECONDS )
86+ .subscribeOn (Schedulers .io ())
87+ .observeOn (AndroidSchedulers .mainThread ());
7688 }
7789
7890 private Observer <List <Integer >> _getObserver () {
@@ -81,8 +93,10 @@ private Observer<List<Integer>> _getObserver() {
8193
8294 @ Override
8395 public void onCompleted () {
84- _log (String .format ("%d taps" , _tapCount ));
85- _tapCount = 0 ;
96+ if (_tapCount > 0 ) {
97+ _log (String .format ("%d taps" , _tapCount ));
98+ _tapCount = 0 ;
99+ }
86100 }
87101
88102 @ Override
@@ -94,22 +108,27 @@ public void onError(Throwable e) {
94108 @ Override
95109 public void onNext (List <Integer > integers ) {
96110 Timber .d ("--------- onNext" );
97-
98111 if (integers .size () > 0 ) {
99112 for (int i : integers ) {
100113 _tapCount += i ;
101114 }
102- onCompleted ();
103115 } else {
104116 Timber .d ("--------- No taps received " );
105117 }
118+ onCompleted ();
106119 }
107120 };
108121 }
109122
110123 // -----------------------------------------------------------------------------------
111124 // Method that help wiring up the example (irrelevant to RxJava)
112125
126+ @ Override
127+ public void onActivityCreated (@ Nullable Bundle savedInstanceState ) {
128+ super .onActivityCreated (savedInstanceState );
129+ _setupLogger ();
130+ }
131+
113132 @ Override
114133 public View onCreateView (LayoutInflater inflater ,
115134 @ Nullable ViewGroup container ,
0 commit comments