Skip to content

Commit 27cf2bb

Browse files
Add Cache Example Using Concat
1 parent cf4fe66 commit 27cf2bb

File tree

10 files changed

+254
-3
lines changed

10 files changed

+254
-3
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
<activity
2525
android:name=".ui.networking.NetworkingActivity"
2626
android:label="@string/networking" />
27+
<activity
28+
android:name=".ui.cache.CacheExampleActivity"
29+
android:label="@string/cache" />
2730
<activity
2831
android:name=".ui.rxbus.RxBusActivity"
2932
android:label="@string/rx_bus" />
@@ -126,7 +129,8 @@
126129
<activity
127130
android:name=".ui.compose.ComposeOperatorExampleActivity"
128131
android:label="@string/compose" />
129-
<activity android:name=".ui.operators.SwitchMapExampleActivity"
132+
<activity
133+
android:name=".ui.operators.SwitchMapExampleActivity"
130134
android:label="@string/switch_map" />
131135
</application>
132136

app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.rxjava2.android.samples.MyApplication;
99
import com.rxjava2.android.samples.R;
10+
import com.rxjava2.android.samples.ui.cache.CacheExampleActivity;
1011
import com.rxjava2.android.samples.ui.compose.ComposeOperatorExampleActivity;
1112
import com.rxjava2.android.samples.ui.networking.NetworkingActivity;
1213
import com.rxjava2.android.samples.ui.pagination.PaginationActivity;
@@ -29,6 +30,10 @@ public void startNetworkingActivity(View view) {
2930
startActivity(new Intent(SelectionActivity.this, NetworkingActivity.class));
3031
}
3132

33+
public void startCacheActivity(View view) {
34+
startActivity(new Intent(SelectionActivity.this, CacheExampleActivity.class));
35+
}
36+
3237
public void startRxBusActivity(View view) {
3338
((MyApplication) getApplication()).sendAutoEvent();
3439
startActivity(new Intent(SelectionActivity.this, RxBusActivity.class));
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.rxjava2.android.samples.ui.cache;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.app.AppCompatActivity;
5+
import android.util.Log;
6+
import android.view.View;
7+
import android.widget.Button;
8+
import android.widget.TextView;
9+
10+
import com.rxjava2.android.samples.R;
11+
import com.rxjava2.android.samples.ui.cache.model.Data;
12+
import com.rxjava2.android.samples.ui.cache.source.DataSource;
13+
import com.rxjava2.android.samples.ui.cache.source.DiskDataSource;
14+
import com.rxjava2.android.samples.ui.cache.source.MemoryDataSource;
15+
import com.rxjava2.android.samples.ui.cache.source.NetworkDataSource;
16+
import com.rxjava2.android.samples.utils.AppConstant;
17+
18+
import io.reactivex.Observable;
19+
import io.reactivex.Observer;
20+
import io.reactivex.android.schedulers.AndroidSchedulers;
21+
import io.reactivex.disposables.Disposable;
22+
import io.reactivex.schedulers.Schedulers;
23+
24+
public class CacheExampleActivity extends AppCompatActivity {
25+
26+
private static final String TAG = CacheExampleActivity.class.getSimpleName();
27+
Button btn;
28+
TextView textView;
29+
DataSource dataSource;
30+
31+
@Override
32+
protected void onCreate(Bundle savedInstanceState) {
33+
super.onCreate(savedInstanceState);
34+
setContentView(R.layout.activity_example);
35+
btn = (Button) findViewById(R.id.btn);
36+
textView = (TextView) findViewById(R.id.textView);
37+
38+
btn.setOnClickListener(new View.OnClickListener() {
39+
@Override
40+
public void onClick(View view) {
41+
doSomeWork();
42+
}
43+
});
44+
45+
dataSource = new DataSource(new MemoryDataSource(), new DiskDataSource(), new NetworkDataSource());
46+
}
47+
48+
private void doSomeWork() {
49+
50+
Observable<Data> memory = dataSource.getDataFromMemory();
51+
Observable<Data> disk = dataSource.getDataFromDisk();
52+
Observable<Data> network = dataSource.getDataFromNetwork();
53+
54+
Observable.concat(memory, disk, network)
55+
.firstElement()
56+
.subscribeOn(Schedulers.io())
57+
.observeOn(AndroidSchedulers.mainThread())
58+
.toObservable()
59+
.subscribe(getObserver());
60+
}
61+
62+
private Observer<Data> getObserver() {
63+
return new Observer<Data>() {
64+
65+
@Override
66+
public void onSubscribe(Disposable d) {
67+
Log.d(TAG, " onSubscribe : " + d.isDisposed());
68+
}
69+
70+
@Override
71+
public void onNext(Data data) {
72+
textView.append(" onNext : " + data.source);
73+
textView.append(AppConstant.LINE_SEPARATOR);
74+
Log.d(TAG, " onNext : " + data.source);
75+
}
76+
77+
@Override
78+
public void onError(Throwable e) {
79+
textView.append(" onError : " + e.getMessage());
80+
textView.append(AppConstant.LINE_SEPARATOR);
81+
Log.d(TAG, " onError : " + e.getMessage());
82+
}
83+
84+
@Override
85+
public void onComplete() {
86+
textView.append(" onComplete");
87+
textView.append(AppConstant.LINE_SEPARATOR);
88+
Log.d(TAG, " onComplete");
89+
}
90+
};
91+
}
92+
93+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.rxjava2.android.samples.ui.cache.model;
2+
3+
public class Data {
4+
5+
public String source;
6+
7+
@SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
8+
@Override
9+
public Data clone() {
10+
return new Data();
11+
}
12+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.rxjava2.android.samples.ui.cache.source;
2+
3+
import com.rxjava2.android.samples.ui.cache.model.Data;
4+
5+
import io.reactivex.Observable;
6+
import io.reactivex.functions.Consumer;
7+
8+
public class DataSource {
9+
10+
private final MemoryDataSource memoryDataSource;
11+
private final DiskDataSource diskDataSource;
12+
private final NetworkDataSource networkDataSource;
13+
14+
public DataSource(MemoryDataSource memoryDataSource,
15+
DiskDataSource diskDataSource,
16+
NetworkDataSource networkDataSource) {
17+
this.memoryDataSource = memoryDataSource;
18+
this.diskDataSource = diskDataSource;
19+
this.networkDataSource = networkDataSource;
20+
}
21+
22+
public Observable<Data> getDataFromMemory() {
23+
return memoryDataSource.getData();
24+
}
25+
26+
public Observable<Data> getDataFromDisk() {
27+
return diskDataSource.getData().doOnNext(new Consumer<Data>() {
28+
@Override
29+
public void accept(Data data) throws Exception {
30+
memoryDataSource.cacheInMemory(data);
31+
}
32+
});
33+
}
34+
35+
public Observable<Data> getDataFromNetwork() {
36+
return networkDataSource.getData().doOnNext(new Consumer<Data>() {
37+
@Override
38+
public void accept(Data data) throws Exception {
39+
diskDataSource.saveToDisk(data);
40+
memoryDataSource.cacheInMemory(data);
41+
}
42+
});
43+
}
44+
45+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.rxjava2.android.samples.ui.cache.source;
2+
3+
import com.rxjava2.android.samples.ui.cache.model.Data;
4+
5+
import io.reactivex.Observable;
6+
import io.reactivex.ObservableEmitter;
7+
import io.reactivex.ObservableOnSubscribe;
8+
9+
public class DiskDataSource {
10+
11+
private Data data;
12+
13+
public Observable<Data> getData() {
14+
return Observable.create(new ObservableOnSubscribe<Data>() {
15+
@Override
16+
public void subscribe(ObservableEmitter<Data> emitter) throws Exception {
17+
if (data != null) {
18+
emitter.onNext(data);
19+
}
20+
emitter.onComplete();
21+
}
22+
});
23+
}
24+
25+
public void saveToDisk(Data data) {
26+
this.data = data.clone();
27+
this.data.source = "disk";
28+
}
29+
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.rxjava2.android.samples.ui.cache.source;
2+
3+
import com.rxjava2.android.samples.ui.cache.model.Data;
4+
5+
import io.reactivex.Observable;
6+
import io.reactivex.ObservableEmitter;
7+
import io.reactivex.ObservableOnSubscribe;
8+
9+
public class MemoryDataSource {
10+
11+
private Data data;
12+
13+
public Observable<Data> getData() {
14+
return Observable.create(new ObservableOnSubscribe<Data>() {
15+
@Override
16+
public void subscribe(ObservableEmitter<Data> emitter) throws Exception {
17+
if (data != null) {
18+
emitter.onNext(data);
19+
}
20+
emitter.onComplete();
21+
}
22+
});
23+
}
24+
25+
public void cacheInMemory(Data data) {
26+
this.data = data.clone();
27+
this.data.source = "memory";
28+
29+
}
30+
31+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.rxjava2.android.samples.ui.cache.source;
2+
3+
import com.rxjava2.android.samples.ui.cache.model.Data;
4+
5+
import io.reactivex.Observable;
6+
import io.reactivex.ObservableEmitter;
7+
import io.reactivex.ObservableOnSubscribe;
8+
9+
public class NetworkDataSource {
10+
11+
public Observable<Data> getData() {
12+
return Observable.create(new ObservableOnSubscribe<Data>() {
13+
@Override
14+
public void subscribe(ObservableEmitter<Data> emitter) throws Exception {
15+
Data data = new Data();
16+
data.source = "network";
17+
emitter.onNext(data);
18+
emitter.onComplete();
19+
}
20+
});
21+
}
22+
23+
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
android:layout_width="match_parent"
55
android:layout_height="match_parent"
66
android:fadeScrollbars="false"
7-
android:paddingBottom="@dimen/activity_vertical_margin"
87
android:paddingLeft="@dimen/activity_horizontal_margin"
9-
android:paddingRight="@dimen/activity_horizontal_margin"
108
android:paddingTop="@dimen/activity_vertical_margin"
9+
android:paddingRight="@dimen/activity_horizontal_margin"
10+
android:paddingBottom="@dimen/activity_vertical_margin"
1111
tools:context="com.rxjava2.android.samples.ui.SelectionActivity">
1212

1313
<LinearLayout
@@ -29,6 +29,13 @@
2929
android:text="@string/networking"
3030
android:textColor="@android:color/black" />
3131

32+
<Button
33+
android:layout_width="match_parent"
34+
android:layout_height="wrap_content"
35+
android:onClick="startCacheActivity"
36+
android:text="@string/cache"
37+
android:textColor="@android:color/black" />
38+
3239
<Button
3340
android:layout_width="match_parent"
3441
android:layout_height="wrap_content"

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<string name="doSomeWork">doSomeWork</string>
44
<string name="operators">Operators</string>
55
<string name="networking">Networking</string>
6+
<string name="cache">Cache</string>
67
<string name="pagination">Pagination</string>
78
<string name="search">Search</string>
89
<string name="simple">Simple</string>

0 commit comments

Comments
 (0)