Skip to content

Commit 42570be

Browse files
author
Kaushik Gopal
committed
feat: timing demo - run once with delay then complete
1 parent fb50334 commit 42570be

File tree

4 files changed

+88
-51
lines changed

4 files changed

+88
-51
lines changed

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.morihacky.android.rxjava;
22

3-
import android.content.Context;
43
import android.os.Bundle;
54
import android.os.Handler;
65
import android.os.Looper;
76
import android.support.annotation.Nullable;
87
import android.view.LayoutInflater;
98
import android.view.View;
109
import android.view.ViewGroup;
11-
import android.widget.ArrayAdapter;
1210
import android.widget.ListView;
1311
import butterknife.ButterKnife;
1412
import butterknife.InjectView;
1513
import butterknife.OnClick;
14+
import com.morihacky.android.rxjava.wiring.LogAdapter;
1615
import java.util.ArrayList;
1716
import java.util.List;
1817
import java.util.concurrent.TimeUnit;
@@ -148,7 +147,7 @@ public void onNext(String taskType) {
148147
// Method that help wiring up the example (irrelevant to RxJava)
149148

150149
private void _setupLogger() {
151-
_logs = new ArrayList<String>();
150+
_logs = new ArrayList<>();
152151
_adapter = new LogAdapter(getActivity(), new ArrayList<String>());
153152
_logsList.setAdapter(_adapter);
154153
}
@@ -178,11 +177,4 @@ private boolean _isCurrentlyOnMainThread() {
178177
return Looper.myLooper() == Looper.getMainLooper();
179178
}
180179

181-
private class LogAdapter
182-
extends ArrayAdapter<String> {
183-
184-
public LogAdapter(Context context, List<String> logs) {
185-
super(context, R.layout.item_log, R.id.item_log, logs);
186-
}
187-
}
188180
}
Lines changed: 68 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
11
package com.morihacky.android.rxjava;
22

33
import android.os.Bundle;
4+
import android.os.Handler;
45
import android.support.annotation.Nullable;
56
import android.view.LayoutInflater;
67
import android.view.View;
78
import android.view.ViewGroup;
9+
import android.widget.ListView;
810
import butterknife.ButterKnife;
11+
import butterknife.InjectView;
912
import butterknife.OnClick;
13+
import com.morihacky.android.rxjava.wiring.LogAdapter;
14+
import java.text.SimpleDateFormat;
15+
import java.util.ArrayList;
16+
import java.util.Date;
17+
import java.util.List;
1018
import java.util.concurrent.TimeUnit;
1119
import rx.Observable;
12-
import rx.android.schedulers.AndroidSchedulers;
13-
import rx.functions.Action0;
14-
import rx.functions.Action1;
15-
import rx.functions.Func1;
20+
import rx.Observer;
1621
import timber.log.Timber;
1722

23+
import static android.os.Looper.getMainLooper;
24+
import static android.os.Looper.myLooper;
25+
1826
public class TimingDemoFragment
1927
extends BaseFragment {
2028

29+
@InjectView(R.id.list_threading_log) ListView _logsList;
30+
31+
private LogAdapter _adapter;
32+
private List<String> _logs;
33+
34+
@Override
35+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
36+
super.onActivityCreated(savedInstanceState);
37+
_setupLogger();
38+
}
39+
2140
@Override
2241
public View onCreateView(LayoutInflater inflater,
2342
@Nullable ViewGroup container,
@@ -27,43 +46,55 @@ public View onCreateView(LayoutInflater inflater,
2746
return layout;
2847
}
2948

30-
@OnClick(R.id.btn_start_demo)
31-
public void onStartButtonClicked() {
32-
Timber.d("-------------------- Shutter clicked");
49+
// -----------------------------------------------------------------------------------
50+
51+
@OnClick(R.id.btn_demo_timing_1)
52+
public void onRunOnceWithDelay() {
53+
_log(String.format("C1 [%s] --- BTN click", _getCurrentTimestamp()));
54+
55+
Observable.just(1).delay(1, TimeUnit.SECONDS).subscribe(new Observer<Integer>() {
56+
@Override
57+
public void onCompleted() {
58+
_log(String.format("C1 [%s] XX COMPLETE", _getCurrentTimestamp()));
59+
}
3360

34-
Observable.just(1).flatMap(new Func1<Integer, Observable<Object>>() {
3561
@Override
36-
public Observable<Object> call(Integer integer) {
37-
return _getCountdownFlashObservable();
62+
public void onError(Throwable e) {
63+
Timber.e(e, "something went wrong in TimingDemoFragment example");
3864
}
39-
}).repeat(3).subscribe();
65+
66+
@Override
67+
public void onNext(Integer integer) {
68+
_log(String.format("C1 [%s] NEXT", _getCurrentTimestamp()));
69+
}
70+
});
4071
}
4172

42-
private Observable<Object> _getCountdownFlashObservable() {
43-
return Observable.interval(1, TimeUnit.SECONDS)
44-
.map(new Func1<Long, Object>() {
45-
@Override
46-
public Object call(Long aLong) {
47-
Timber.d("-------------------- Number to show %s",
48-
String.valueOf(3l - aLong));
49-
return 3l - aLong;
50-
}
51-
})
52-
.take(3)
53-
.observeOn(AndroidSchedulers.mainThread())
54-
.doOnNext(new Action1<Object>() {
55-
@Override
56-
public void call(Object o) {
57-
Timber.d("-------------------- %s", String.valueOf(o));
58-
}
59-
})
60-
.delay(1, TimeUnit.SECONDS)
61-
.observeOn(AndroidSchedulers.mainThread())
62-
.doOnCompleted(new Action0() {
63-
@Override
64-
public void call() {
65-
Timber.d("-------------------- FLASH!");
66-
}
67-
});
73+
// -----------------------------------------------------------------------------------
74+
// Method that help wiring up the example (irrelevant to RxJava)
75+
76+
private void _setupLogger() {
77+
_logs = new ArrayList<>();
78+
_adapter = new LogAdapter(getActivity(), new ArrayList<String>());
79+
_logsList.setAdapter(_adapter);
6880
}
81+
82+
private void _log(String logMsg) {
83+
_logs.add(0, String.format(logMsg + " [MainThread: %b]", getMainLooper() == myLooper()));
84+
85+
// You can only do below stuff on main thread.
86+
new Handler(getMainLooper()).post(new Runnable() {
87+
88+
@Override
89+
public void run() {
90+
_adapter.clear();
91+
_adapter.addAll(_logs);
92+
}
93+
});
94+
}
95+
96+
private String _getCurrentTimestamp() {
97+
return new SimpleDateFormat("k:m:s:S a").format(new Date());
98+
}
99+
69100
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.morihacky.android.rxjava.wiring;
2+
3+
import android.content.Context;
4+
import android.widget.ArrayAdapter;
5+
import com.morihacky.android.rxjava.R;
6+
import java.util.List;
7+
8+
public class LogAdapter
9+
extends ArrayAdapter<String> {
10+
11+
public LogAdapter(Context context, List<String> logs) {
12+
super(context, R.layout.item_log, R.id.item_log, logs);
13+
}
14+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222
android:layout_weight="1"
2323
android:layout_height="wrap_content"
2424
android:layout_width="wrap_content"
25-
android:text="run once after a delay"
25+
android:text="C1: run once after a delay"
2626
/>
2727

2828
<Button
2929
android:id="@+id/btn_demo_timing_3"
3030
android:layout_weight="1"
3131
android:layout_height="wrap_content"
3232
android:layout_width="wrap_content"
33-
android:text="run at intervals (start with delay)"
33+
android:text="C3: run at intervals (start with delay)"
3434
/>
3535
</TableRow>
3636

@@ -44,15 +44,15 @@
4444
android:layout_weight="1"
4545
android:layout_height="wrap_content"
4646
android:layout_width="wrap_content"
47-
android:text="run 5 times at specific intervals"
47+
android:text="C2: run 5 times at specific intervals"
4848
/>
4949

5050
<Button
5151
android:id="@+id/btn_demo_timing_4"
5252
android:layout_weight="1"
5353
android:layout_height="wrap_content"
5454
android:layout_width="wrap_content"
55-
android:text="intervals (but start immediately)"
55+
android:text="C4: intervals (but start immediately)"
5656
/>
5757
</TableRow>
5858
</TableLayout>

0 commit comments

Comments
 (0)