Skip to content

Commit 081983c

Browse files
author
Kaushik Gopal
committed
feat: concurrency with schedulers demo (running long operation in bg)
1 parent adffc8e commit 081983c

File tree

2 files changed

+84
-34
lines changed

2 files changed

+84
-34
lines changed

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

Lines changed: 82 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,48 @@
1010
import android.view.View;
1111
import android.view.ViewGroup;
1212
import android.widget.ArrayAdapter;
13-
import android.widget.Button;
1413
import android.widget.ListView;
1514
import android.widget.ProgressBar;
1615

1716
import com.morihacky.android.rxjava.app.R;
1817

1918
import java.util.ArrayList;
2019
import java.util.List;
21-
import java.util.concurrent.TimeUnit;
2220

2321
import butterknife.ButterKnife;
2422
import butterknife.InjectView;
2523
import butterknife.OnClick;
2624
import rx.Observable;
2725
import rx.Observer;
2826
import rx.Subscriber;
27+
import rx.Subscription;
28+
import rx.android.observables.AndroidObservable;
29+
import rx.android.schedulers.AndroidSchedulers;
2930
import rx.schedulers.Schedulers;
3031
import timber.log.Timber;
3132

3233
public 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

app/src/main/res/layout/fragment_concurrency_schedulers.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
android:layout_width="wrap_content"
2525
android:layout_marginLeft="20dp"
2626
android:textSize="16sp"
27-
android:text="Start long running operation"/>
27+
android:text="Start long operation"/>
2828

2929
<ProgressBar
3030
android:id="@+id/progress_operation_running"
31-
android:visibility="gone"
31+
android:visibility="invisible"
3232
android:layout_height="wrap_content"
3333
android:layout_width="wrap_content"
3434
android:layout_marginLeft="20dp"/>

0 commit comments

Comments
 (0)