Skip to content

Commit 7a3e0e0

Browse files
author
Kaushik Gopal
committed
fix: buffer implementation for accumulation
1 parent 2f4289b commit 7a3e0e0

File tree

1 file changed

+44
-25
lines changed

1 file changed

+44
-25
lines changed

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

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.view.View;
1111
import android.view.ViewGroup;
1212
import android.widget.ArrayAdapter;
13+
import android.widget.Button;
1314
import android.widget.ListView;
1415

1516
import com.morihacky.android.rxjava.app.R;
@@ -20,59 +21,70 @@
2021

2122
import butterknife.ButterKnife;
2223
import butterknife.InjectView;
23-
import butterknife.OnClick;
2424
import rx.Observable;
2525
import rx.Observer;
2626
import rx.Subscriber;
27+
import rx.Subscription;
2728
import rx.android.schedulers.AndroidSchedulers;
2829
import rx.schedulers.Schedulers;
2930
import 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+
*/
3139
public 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

Comments
 (0)