|
18 | 18 | import butterknife.ButterKnife; |
19 | 19 | import butterknife.InjectView; |
20 | 20 | import butterknife.OnClick; |
| 21 | +import rx.Observable; |
| 22 | +import rx.Observer; |
| 23 | +import rx.android.observables.AndroidObservable; |
| 24 | +import rx.android.schedulers.AndroidSchedulers; |
| 25 | +import rx.functions.Action1; |
| 26 | +import rx.schedulers.Schedulers; |
| 27 | +import rx.subjects.BehaviorSubject; |
| 28 | +import timber.log.Timber; |
21 | 29 |
|
22 | 30 | public class DemoAccumulateEventFragment |
23 | | - extends Fragment { |
| 31 | + extends Fragment |
| 32 | + implements Observer<Integer> { |
24 | 33 |
|
25 | 34 | @InjectView(R.id.accumulated_event_list) ListView _logsListView; |
26 | 35 |
|
27 | 36 | private LogAdapter _adapter; |
28 | 37 | private List<String> _logs; |
29 | 38 |
|
30 | | - @Override |
31 | | - public View onCreateView(LayoutInflater inflater, |
32 | | - @Nullable ViewGroup container, |
33 | | - @Nullable Bundle savedInstanceState) { |
34 | | - View layout = inflater.inflate(R.layout.fragment_accumulate, container, false); |
35 | | - ButterKnife.inject(this, layout); |
36 | | - return layout; |
37 | | - } |
| 39 | + private BehaviorSubject<Observable<Integer>> _loggerSubject; // Special Rx entity that modifies Observable behavior for aggregation |
| 40 | + private int _counter = 0; |
38 | 41 |
|
39 | 42 | @Override |
40 | 43 | public void onActivityCreated(@Nullable Bundle savedInstanceState) { |
41 | 44 | super.onActivityCreated(savedInstanceState); |
42 | 45 | _setupLogAdapter(); |
| 46 | + |
| 47 | + // Create the subscription |
| 48 | + AndroidObservable.bindFragment(this, _getObservable_ForTaps()) // Observable |
| 49 | + .observeOn(AndroidSchedulers.mainThread()) |
| 50 | + .subscribeOn(Schedulers.io()) |
| 51 | + .subscribe(_getSubscriber_ForTaps()); // Subscriber |
43 | 52 | } |
44 | 53 |
|
| 54 | + |
45 | 55 | @OnClick(R.id.accumulated_event_btn) |
46 | 56 | public void onButtonTapped() { |
| 57 | + // BehaviorSubject takes in Observable inputs. |
| 58 | + // So send 1 tap as an observable |
| 59 | + _loggerSubject.onNext(Observable.from(1)); |
| 60 | + } |
| 61 | + |
| 62 | + // ----------------------------------------------------------------------------------- |
| 63 | + // Main Rx entities |
| 64 | + |
| 65 | + /** |
| 66 | + * Gets the Observable as emitted from BehaviorSubject |
| 67 | + * |
| 68 | + * It begins by emitting the item most recently emitted by source Observable |
| 69 | + * (or seed/default if none has yet been emitted - which is the case here) |
| 70 | + * |
| 71 | + * https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject |
| 72 | + */ |
| 73 | + private Observable<Integer> _getObservable_ForTaps() { |
| 74 | + if (_loggerSubject == null) { |
| 75 | + _loggerSubject = BehaviorSubject.create(Observable.from(0)); |
| 76 | + } |
| 77 | + |
| 78 | + return Observable.switchOnNext(_loggerSubject); |
| 79 | + } |
47 | 80 |
|
48 | | - _addLogToAdapter("Tapped"); |
| 81 | + /** |
| 82 | + * Subscriber that has the 3 important actions |
| 83 | + * 1. onNext |
| 84 | + * 2. onError |
| 85 | + * 3. onCompleted |
| 86 | + */ |
| 87 | + private Observer<? super Integer> _getSubscriber_ForTaps() { |
| 88 | + return this; |
| 89 | + } |
| 90 | + |
| 91 | + /*private Action1<Integer> _getSubscriber_ForTaps() { |
| 92 | + return new Action1<Integer>(){ |
| 93 | +
|
| 94 | +
|
| 95 | + @Override |
| 96 | + public void call(Integer integer) { |
| 97 | +
|
| 98 | + } |
| 99 | + }; |
| 100 | + }*/ |
| 101 | + |
| 102 | + |
| 103 | + @Override |
| 104 | + public void onCompleted() { |
| 105 | + Timber.d("--------- completed "); |
| 106 | + _addLogToAdapter(String.format("%d taps", _counter)); |
| 107 | + _counter = 0; |
| 108 | + } |
| 109 | + |
| 110 | + @Override |
| 111 | + public void onNext(Integer integer) { |
| 112 | + _counter += integer; |
| 113 | + onCompleted(); |
| 114 | + } |
| 115 | + |
| 116 | + @Override |
| 117 | + public void onError(Throwable e) { |
| 118 | + Timber.e(e, "--------- Woops something went wrong"); |
49 | 119 | } |
50 | 120 |
|
51 | 121 | // ----------------------------------------------------------------------------------- |
52 | 122 | // Method that help wiring up the example (irrelevant to RxJava) |
53 | 123 |
|
| 124 | + @Override |
| 125 | + public View onCreateView(LayoutInflater inflater, |
| 126 | + @Nullable ViewGroup container, |
| 127 | + @Nullable Bundle savedInstanceState) { |
| 128 | + View layout = inflater.inflate(R.layout.fragment_accumulate, container, false); |
| 129 | + ButterKnife.inject(this, layout); |
| 130 | + return layout; |
| 131 | + } |
| 132 | + |
54 | 133 | private void _setupLogAdapter() { |
55 | 134 | _logs = new ArrayList<String>(); |
56 | 135 | _adapter = new LogAdapter(getActivity(), new ArrayList<String>()); |
|
0 commit comments