1010import android .view .View ;
1111import android .view .ViewGroup ;
1212import android .widget .ArrayAdapter ;
13- import android .widget .Button ;
1413import android .widget .ListView ;
1514import android .widget .ProgressBar ;
1615
1716import com .morihacky .android .rxjava .app .R ;
1817
1918import java .util .ArrayList ;
2019import java .util .List ;
21- import java .util .concurrent .TimeUnit ;
2220
2321import butterknife .ButterKnife ;
2422import butterknife .InjectView ;
2523import butterknife .OnClick ;
2624import rx .Observable ;
2725import rx .Observer ;
2826import rx .Subscriber ;
27+ import rx .Subscription ;
28+ import rx .android .observables .AndroidObservable ;
29+ import rx .android .schedulers .AndroidSchedulers ;
2930import rx .schedulers .Schedulers ;
3031import timber .log .Timber ;
3132
3233public class ConcurrencyWithSchedulersDemoFragment
3334 extends Fragment {
3435
3536
36- // @InjectView(R.id.btn_start_operation) Button _btnStart;
3737 @ InjectView (R .id .progress_operation_running ) ProgressBar _progress ;
3838 @ InjectView (R .id .list_threading_log ) ListView _logsList ;
3939
4040 private LogAdapter _adapter ;
4141 private List <String > _logs ;
42+ private Subscription _subscription ;
4243
44+ @ OnClick (R .id .btn_start_operation )
45+ public void startLongOperation () {
46+
47+ _progress .setVisibility (View .VISIBLE );
48+ _log ("Button Clicked" );
49+
50+ _subscription = AndroidObservable .bindFragment (this , _getObservable ()) // Observable
51+ .subscribeOn (Schedulers .io ())
52+ .observeOn (AndroidSchedulers .mainThread ())
53+ .subscribe (_getObserver ()); // Observer
54+ }
4355
4456 // -----------------------------------------------------------------------------------
4557 // Main Rx entities
@@ -52,15 +64,20 @@ public class ConcurrencyWithSchedulersDemoFragment
5264 *
5365 * https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject
5466 */
55- private Observable <List < Integer > > _getObservable () {
56- return Observable .create (new Observable .OnSubscribe <Integer >() {
67+ private Observable <Boolean > _getObservable () {
68+ return Observable .create (new Observable .OnSubscribe <Boolean >() {
5769
5870
5971 @ Override
60- public void call (Subscriber <? super Integer > observer ) {
61- observer .onNext (1 );
72+ public void call (Subscriber <? super Boolean > observer ) {
73+
74+ _log ("Within Observable" );
75+
76+ _doSomeLongOperation_thatBlocksCurrentThread ();
77+ observer .onNext (true );
78+ observer .onCompleted ();
6279 }
63- }). buffer ( 2 , TimeUnit . SECONDS ) ;
80+ });
6481 }
6582
6683 /**
@@ -71,43 +88,78 @@ public void call(Subscriber<? super Integer> observer) {
7188 * 2. onError
7289 * 3. onNext
7390 */
74- private Observer <List < Integer > > _getObserver () {
75- return new Observer <List < Integer > >() {
91+ private Observer <Boolean > _getObserver () {
92+ return new Observer <Boolean >() {
7693
7794
7895 @ Override
7996 public void onCompleted () {
80- _mainThreadHandler .post (new Runnable () {
81-
82-
83- @ Override
84- public void run () {
85- _addLogToAdapter (String .format ("%d taps" , _counter ));
86- _counter = 0 ;
87- }
88- });
97+ _log ("On complete" );
98+ _progress .setVisibility (View .INVISIBLE );
8999 }
90100
91101 @ Override
92102 public void onError (Throwable e ) {
93- Timber .e (e , "--------- Woops on error!" );
103+ Timber .e (e , "Error in RxJava Demo concurrency" );
104+ _log (String .format ("Boo Error %s" , e .getMessage ()));
105+ _progress .setVisibility (View .INVISIBLE );
94106 }
95107
96108 @ Override
97- public void onNext (List <Integer > integers ) {
98- for (int i : integers ) {
99- _counter += i ;
100- }
101-
102- Timber .d ("--------- on next with a count of %d" , _counter );
103- onCompleted ();
109+ public void onNext (Boolean aBoolean ) {
110+ _log (String .format ("onNext with return value \" %b\" " , aBoolean ));
104111 }
105112 };
106113 }
107114
115+ @ Override
116+ public void onDestroy () {
117+ super .onDestroy ();
118+ _subscription .unsubscribe ();
119+ }
120+
121+ private void _log (String logMsg ) {
122+
123+ if (_isCurrentlyOnMainThread ()) {
124+ _logs .add (0 , logMsg + " (main thread) " );
125+ _adapter .clear ();
126+ _adapter .addAll (_logs );
127+
128+ } else {
129+ _logs .add (0 , logMsg + " (NOT main thread) " );
130+
131+ // You can only do below stuff on main thread.
132+ new Handler (Looper .getMainLooper ()).post (new Runnable () {
133+
134+
135+ @ Override
136+ public void run () {
137+ _adapter .clear ();
138+ _adapter .addAll (_logs );
139+ }
140+ });
141+ }
142+ }
143+
108144 // -----------------------------------------------------------------------------------
109145 // Method that help wiring up the example (irrelevant to RxJava)
110146
147+ private void _doSomeLongOperation_thatBlocksCurrentThread () {
148+ _log ("performing long operation" );
149+
150+ try {
151+ Thread .sleep (3000 );
152+ } catch (InterruptedException e ) {
153+ e .printStackTrace ();
154+ }
155+ }
156+
157+ @ Override
158+ public void onActivityCreated (@ Nullable Bundle savedInstanceState ) {
159+ super .onActivityCreated (savedInstanceState );
160+ _setupLogAdapter ();
161+ }
162+
111163 @ Override
112164 public View onCreateView (LayoutInflater inflater ,
113165 @ Nullable ViewGroup container ,
@@ -120,13 +172,11 @@ public View onCreateView(LayoutInflater inflater,
120172 private void _setupLogAdapter () {
121173 _logs = new ArrayList <String >();
122174 _adapter = new LogAdapter (getActivity (), new ArrayList <String >());
123- _logsListView .setAdapter (_adapter );
175+ _logsList .setAdapter (_adapter );
124176 }
125177
126- private void _addLogToAdapter (String logMsg ) {
127- _logs .add (0 , logMsg );
128- _adapter .clear ();
129- _adapter .addAll (_logs );
178+ private boolean _isCurrentlyOnMainThread () {
179+ return Looper .myLooper () == Looper .getMainLooper ();
130180 }
131181
132182 private class LogAdapter
0 commit comments