Skip to content

Commit 897ea73

Browse files
author
Kaushik Gopal
committed
feat: port Activity rotation examples
* port example Persist data on Activity rotations (using Subjects and retained Fragments) * port example Persist data on Activity rotations (using Subjects and retained Fragments) old variant we no longer have a subscription coming out, so use another subject
1 parent 59b8195 commit 897ea73

File tree

4 files changed

+132
-136
lines changed

4 files changed

+132
-136
lines changed

app/src/main/java/com/morihacky/android/rxjava/fragments/RotationPersist1Fragment.java

+37-39
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,19 @@
88
import android.view.View;
99
import android.view.ViewGroup;
1010
import android.widget.ListView;
11-
11+
import butterknife.Bind;
12+
import butterknife.ButterKnife;
13+
import butterknife.OnClick;
1214
import com.morihacky.android.rxjava.R;
1315
import com.morihacky.android.rxjava.wiring.LogAdapter;
14-
16+
import io.reactivex.Flowable;
17+
import io.reactivex.disposables.CompositeDisposable;
18+
import io.reactivex.subscribers.DisposableSubscriber;
1519
import java.util.ArrayList;
1620
import java.util.List;
17-
18-
import butterknife.Bind;
19-
import butterknife.ButterKnife;
20-
import butterknife.OnClick;
21-
import rx.Observer;
22-
import rx.functions.Action0;
23-
import rx.observables.ConnectableObservable;
24-
import rx.subscriptions.CompositeSubscription;
2521
import timber.log.Timber;
2622

23+
2724
import static android.os.Looper.getMainLooper;
2825

2926
public class RotationPersist1Fragment
@@ -37,7 +34,7 @@ public class RotationPersist1Fragment
3734
private LogAdapter _adapter;
3835
private List<String> _logs;
3936

40-
private CompositeSubscription _subscriptions = new CompositeSubscription();
37+
private CompositeDisposable _disposables = new CompositeDisposable();
4138

4239
// -----------------------------------------------------------------------------------
4340

@@ -47,7 +44,7 @@ public void startOperationFromWorkerFrag() {
4744
_adapter.clear();
4845

4946
FragmentManager fm = getActivity().getSupportFragmentManager();
50-
RotationPersist1WorkerFragment frag =//
47+
RotationPersist1WorkerFragment frag =
5148
(RotationPersist1WorkerFragment) fm.findFragmentByTag(FRAG_TAG);
5249

5350
if (frag == null) {
@@ -59,32 +56,33 @@ public void startOperationFromWorkerFrag() {
5956
}
6057

6158
@Override
62-
public void observeResults(ConnectableObservable<Integer> intsObservable) {
63-
64-
_subscriptions.add(//
65-
intsObservable.doOnSubscribe(new Action0() {
66-
@Override
67-
public void call() {
68-
_log("Subscribing to intsObservable");
69-
}
70-
}).subscribe(new Observer<Integer>() {
71-
@Override
72-
public void onCompleted() {
73-
_log("Observable is complete");
74-
}
75-
76-
@Override
77-
public void onError(Throwable e) {
78-
Timber.e(e, "Error in worker demo frag observable");
79-
_log("Dang! something went wrong.");
80-
}
81-
82-
@Override
83-
public void onNext(Integer integer) {
84-
_log(String.format("Worker frag spits out - %d", integer));
85-
}
86-
}));
87-
59+
public void observeResults(Flowable<Integer> intsFlowable) {
60+
61+
DisposableSubscriber<Integer> d = new DisposableSubscriber<Integer>() {
62+
@Override
63+
public void onNext(Integer integer) {
64+
_log(String.format("Worker frag spits out - %d", integer));
65+
}
66+
67+
@Override
68+
public void onError(Throwable e) {
69+
Timber.e(e, "Error in worker demo frag observable");
70+
_log("Dang! something went wrong.");
71+
}
72+
73+
@Override
74+
public void onComplete() {
75+
_log("Observable is complete");
76+
}
77+
};
78+
79+
intsFlowable
80+
.doOnSubscribe(subscription -> {
81+
_log("Subscribing to intsObservable");
82+
})
83+
.subscribe(d);
84+
85+
_disposables.add(d);
8886
}
8987

9088
// -----------------------------------------------------------------------------------
@@ -109,7 +107,7 @@ public View onCreateView(LayoutInflater inflater,
109107
@Override
110108
public void onPause() {
111109
super.onPause();
112-
_subscriptions.clear();
110+
_disposables.clear();
113111
}
114112

115113
@Override

app/src/main/java/com/morihacky/android/rxjava/fragments/RotationPersist1WorkerFragment.java

+23-34
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,19 @@
33
import android.content.Context;
44
import android.os.Bundle;
55
import android.support.v4.app.Fragment;
6-
76
import com.morihacky.android.rxjava.MainActivity;
8-
7+
import io.reactivex.Flowable;
8+
import io.reactivex.disposables.Disposable;
9+
import io.reactivex.flowables.ConnectableFlowable;
910
import java.util.List;
1011
import java.util.concurrent.TimeUnit;
1112

12-
import rx.Observable;
13-
import rx.Subscription;
14-
import rx.observables.ConnectableObservable;
15-
1613
public class RotationPersist1WorkerFragment
1714
extends Fragment {
1815

1916
private IAmYourMaster _masterFrag;
20-
private ConnectableObservable<Integer> _storedIntsObservable;
21-
private Subscription _storedIntsSubscription;
17+
private ConnectableFlowable<Integer> _storedIntsFlowable;
18+
private Disposable _storedIntsDisposable;
2219

2320
/**
2421
* Hold a reference to the activity -> caller fragment
@@ -29,7 +26,9 @@ public class RotationPersist1WorkerFragment
2926
public void onAttach(Context context) {
3027
super.onAttach(context);
3128

32-
List<Fragment> frags = ((MainActivity) context).getSupportFragmentManager().getFragments();
29+
List<Fragment> frags = ((MainActivity) context)
30+
.getSupportFragmentManager()
31+
.getFragments();
3332
for (Fragment f : frags) {
3433
if (f instanceof IAmYourMaster) {
3534
_masterFrag = (IAmYourMaster) f;
@@ -51,27 +50,17 @@ public void onCreate(Bundle savedInstanceState) {
5150
// Retain this fragment across configuration changes.
5251
setRetainInstance(true);
5352

54-
if (_storedIntsObservable != null) {
53+
if (_storedIntsFlowable != null) {
5554
return;
5655
}
5756

58-
Observable<Integer> intsObservable =//
59-
Observable.interval(1, TimeUnit.SECONDS)//
60-
.map(Long::intValue)//
61-
.take(20);
62-
63-
// -----------------------------------------------------------------------------------
64-
// Making our observable "HOT" for the purpose of the demo.
57+
Flowable<Integer> intsObservable = Flowable
58+
.interval(1, TimeUnit.SECONDS)
59+
.map(Long::intValue)
60+
.take(20);
6561

66-
//_intsObservable = _intsObservable.share();
67-
_storedIntsObservable = intsObservable.replay();
68-
69-
_storedIntsSubscription = _storedIntsObservable.connect();
70-
71-
// Do not do this in production!
72-
// `.share` is "warm" not "hot"
73-
// the below forceful subscription fakes the heat
74-
//_intsObservable.subscribe();
62+
_storedIntsFlowable = intsObservable.publish();
63+
_storedIntsDisposable = _storedIntsFlowable.connect();
7564
}
7665

7766
/**
@@ -80,7 +69,13 @@ public void onCreate(Bundle savedInstanceState) {
8069
@Override
8170
public void onResume() {
8271
super.onResume();
83-
_masterFrag.observeResults(_storedIntsObservable);
72+
_masterFrag.observeResults(_storedIntsFlowable);
73+
}
74+
75+
@Override
76+
public void onDestroy() {
77+
super.onDestroy();
78+
_storedIntsDisposable.dispose();
8479
}
8580

8681
/**
@@ -93,13 +88,7 @@ public void onDetach() {
9388
_masterFrag = null;
9489
}
9590

96-
@Override
97-
public void onDestroy() {
98-
super.onDestroy();
99-
_storedIntsSubscription.unsubscribe();
100-
}
101-
10291
public interface IAmYourMaster {
103-
void observeResults(ConnectableObservable<Integer> intsObservable);
92+
void observeResults(Flowable<Integer> intsObservable);
10493
}
10594
}

app/src/main/java/com/morihacky/android/rxjava/fragments/RotationPersist2Fragment.java

+42-37
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,19 @@
88
import android.view.View;
99
import android.view.ViewGroup;
1010
import android.widget.ListView;
11-
11+
import butterknife.Bind;
12+
import butterknife.ButterKnife;
13+
import butterknife.OnClick;
1214
import com.morihacky.android.rxjava.R;
1315
import com.morihacky.android.rxjava.wiring.LogAdapter;
14-
16+
import io.reactivex.Flowable;
17+
import io.reactivex.disposables.CompositeDisposable;
18+
import io.reactivex.subscribers.DisposableSubscriber;
1519
import java.util.ArrayList;
1620
import java.util.List;
17-
18-
import butterknife.Bind;
19-
import butterknife.ButterKnife;
20-
import butterknife.OnClick;
21-
import rx.Observable;
22-
import rx.Observer;
23-
import rx.subscriptions.CompositeSubscription;
2421
import timber.log.Timber;
2522

23+
2624
import static android.os.Looper.getMainLooper;
2725

2826
public class RotationPersist2Fragment
@@ -36,7 +34,7 @@ public class RotationPersist2Fragment
3634
private LogAdapter _adapter;
3735
private List<String> _logs;
3836

39-
private CompositeSubscription _subscriptions = new CompositeSubscription();
37+
private CompositeDisposable _disposables = new CompositeDisposable();
4038

4139
// -----------------------------------------------------------------------------------
4240

@@ -46,42 +44,49 @@ public void startOperationFromWorkerFrag() {
4644
_adapter.clear();
4745

4846
FragmentManager fm = getActivity().getSupportFragmentManager();
49-
RotationPersist2WorkerFragment frag =//
50-
(RotationPersist2WorkerFragment) fm.findFragmentByTag(FRAG_TAG);
47+
RotationPersist2WorkerFragment frag = (RotationPersist2WorkerFragment) fm.findFragmentByTag(FRAG_TAG);
5148

5249
if (frag == null) {
5350
frag = new RotationPersist2WorkerFragment();
54-
fm.beginTransaction().add(frag, FRAG_TAG).commit();
55-
} else {
51+
fm
52+
.beginTransaction()
53+
.add(frag, FRAG_TAG)
54+
.commit();
55+
}
56+
else {
5657
Timber.d("Worker frag already spawned");
5758
}
5859
}
5960

6061
@Override
61-
public void setStream(Observable<Integer> intStream) {
62-
63-
_subscriptions.add(//
64-
intStream.doOnSubscribe(() -> _log("Subscribing to intsObservable"))
65-
.subscribe(new Observer<Integer>() {
66-
@Override
67-
public void onCompleted() {
68-
_log("Observable is complete");
69-
}
70-
71-
@Override
72-
public void onError(Throwable e) {
73-
Timber.e(e, "Error in worker demo frag observable");
74-
_log("Dang! something went wrong.");
75-
}
76-
77-
@Override
78-
public void onNext(Integer integer) {
79-
_log(String.format("Worker frag spits out - %d", integer));
80-
}
81-
}));
62+
public void setStream(Flowable<Integer> intStream) {
63+
DisposableSubscriber<Integer> d = new DisposableSubscriber<Integer>() {
64+
@Override
65+
public void onNext(Integer integer) {
66+
_log(String.format("Worker frag spits out - %d", integer));
67+
}
68+
69+
@Override
70+
public void onError(Throwable e) {
71+
Timber.e(e, "Error in worker demo frag observable");
72+
_log("Dang! something went wrong.");
73+
}
74+
75+
@Override
76+
public void onComplete() {
77+
_log("Observable is complete");
78+
}
79+
};
80+
81+
intStream
82+
.doOnSubscribe(subscription -> _log("Subscribing to intsObservable"))
83+
.subscribe(d);
84+
85+
_disposables.add(d);
86+
8287
}
8388

84-
// -----------------------------------------------------------------------------------
89+
// -----------------------------------------------------------------------------------
8590
// Boilerplate
8691
// -----------------------------------------------------------------------------------
8792

@@ -103,7 +108,7 @@ public View onCreateView(LayoutInflater inflater,
103108
@Override
104109
public void onPause() {
105110
super.onPause();
106-
_subscriptions.clear();
111+
_disposables.clear();
107112
}
108113

109114
private void _setupLogger() {

0 commit comments

Comments
 (0)