From 27cf2bb91a14ced24ae616bc94871d4de9330999 Mon Sep 17 00:00:00 2001 From: amitshekhariitbhu Date: Tue, 19 Mar 2019 14:04:55 +0530 Subject: [PATCH 01/28] Add Cache Example Using Concat --- app/src/main/AndroidManifest.xml | 6 +- .../android/samples/ui/SelectionActivity.java | 5 + .../ui/cache/CacheExampleActivity.java | 93 +++++++++++++++++++ .../android/samples/ui/cache/model/Data.java | 12 +++ .../samples/ui/cache/source/DataSource.java | 45 +++++++++ .../ui/cache/source/DiskDataSource.java | 30 ++++++ .../ui/cache/source/MemoryDataSource.java | 31 +++++++ .../ui/cache/source/NetworkDataSource.java | 23 +++++ .../main/res/layout/activity_selection.xml | 11 ++- app/src/main/res/values/strings.xml | 1 + 10 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ec63671..0006b4e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ + @@ -126,7 +129,8 @@ - diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java index d3c6082..b2c88e2 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java @@ -7,6 +7,7 @@ import com.rxjava2.android.samples.MyApplication; import com.rxjava2.android.samples.R; +import com.rxjava2.android.samples.ui.cache.CacheExampleActivity; import com.rxjava2.android.samples.ui.compose.ComposeOperatorExampleActivity; import com.rxjava2.android.samples.ui.networking.NetworkingActivity; import com.rxjava2.android.samples.ui.pagination.PaginationActivity; @@ -29,6 +30,10 @@ public void startNetworkingActivity(View view) { startActivity(new Intent(SelectionActivity.this, NetworkingActivity.class)); } + public void startCacheActivity(View view) { + startActivity(new Intent(SelectionActivity.this, CacheExampleActivity.class)); + } + public void startRxBusActivity(View view) { ((MyApplication) getApplication()).sendAutoEvent(); startActivity(new Intent(SelectionActivity.this, RxBusActivity.class)); diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java new file mode 100644 index 0000000..25cc500 --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java @@ -0,0 +1,93 @@ +package com.rxjava2.android.samples.ui.cache; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.rxjava2.android.samples.R; +import com.rxjava2.android.samples.ui.cache.model.Data; +import com.rxjava2.android.samples.ui.cache.source.DataSource; +import com.rxjava2.android.samples.ui.cache.source.DiskDataSource; +import com.rxjava2.android.samples.ui.cache.source.MemoryDataSource; +import com.rxjava2.android.samples.ui.cache.source.NetworkDataSource; +import com.rxjava2.android.samples.utils.AppConstant; + +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +public class CacheExampleActivity extends AppCompatActivity { + + private static final String TAG = CacheExampleActivity.class.getSimpleName(); + Button btn; + TextView textView; + DataSource dataSource; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_example); + btn = (Button) findViewById(R.id.btn); + textView = (TextView) findViewById(R.id.textView); + + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + doSomeWork(); + } + }); + + dataSource = new DataSource(new MemoryDataSource(), new DiskDataSource(), new NetworkDataSource()); + } + + private void doSomeWork() { + + Observable memory = dataSource.getDataFromMemory(); + Observable disk = dataSource.getDataFromDisk(); + Observable network = dataSource.getDataFromNetwork(); + + Observable.concat(memory, disk, network) + .firstElement() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .toObservable() + .subscribe(getObserver()); + } + + private Observer getObserver() { + return new Observer() { + + @Override + public void onSubscribe(Disposable d) { + Log.d(TAG, " onSubscribe : " + d.isDisposed()); + } + + @Override + public void onNext(Data data) { + textView.append(" onNext : " + data.source); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onNext : " + data.source); + } + + @Override + public void onError(Throwable e) { + textView.append(" onError : " + e.getMessage()); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onError : " + e.getMessage()); + } + + @Override + public void onComplete() { + textView.append(" onComplete"); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onComplete"); + } + }; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java new file mode 100644 index 0000000..477144e --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java @@ -0,0 +1,12 @@ +package com.rxjava2.android.samples.ui.cache.model; + +public class Data { + + public String source; + + @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException") + @Override + public Data clone() { + return new Data(); + } +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java new file mode 100644 index 0000000..f0297ed --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java @@ -0,0 +1,45 @@ +package com.rxjava2.android.samples.ui.cache.source; + +import com.rxjava2.android.samples.ui.cache.model.Data; + +import io.reactivex.Observable; +import io.reactivex.functions.Consumer; + +public class DataSource { + + private final MemoryDataSource memoryDataSource; + private final DiskDataSource diskDataSource; + private final NetworkDataSource networkDataSource; + + public DataSource(MemoryDataSource memoryDataSource, + DiskDataSource diskDataSource, + NetworkDataSource networkDataSource) { + this.memoryDataSource = memoryDataSource; + this.diskDataSource = diskDataSource; + this.networkDataSource = networkDataSource; + } + + public Observable getDataFromMemory() { + return memoryDataSource.getData(); + } + + public Observable getDataFromDisk() { + return diskDataSource.getData().doOnNext(new Consumer() { + @Override + public void accept(Data data) throws Exception { + memoryDataSource.cacheInMemory(data); + } + }); + } + + public Observable getDataFromNetwork() { + return networkDataSource.getData().doOnNext(new Consumer() { + @Override + public void accept(Data data) throws Exception { + diskDataSource.saveToDisk(data); + memoryDataSource.cacheInMemory(data); + } + }); + } + +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java new file mode 100644 index 0000000..2d9628b --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java @@ -0,0 +1,30 @@ +package com.rxjava2.android.samples.ui.cache.source; + +import com.rxjava2.android.samples.ui.cache.model.Data; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; + +public class DiskDataSource { + + private Data data; + + public Observable getData() { + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + if (data != null) { + emitter.onNext(data); + } + emitter.onComplete(); + } + }); + } + + public void saveToDisk(Data data) { + this.data = data.clone(); + this.data.source = "disk"; + } + +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java new file mode 100644 index 0000000..215d63c --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java @@ -0,0 +1,31 @@ +package com.rxjava2.android.samples.ui.cache.source; + +import com.rxjava2.android.samples.ui.cache.model.Data; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; + +public class MemoryDataSource { + + private Data data; + + public Observable getData() { + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + if (data != null) { + emitter.onNext(data); + } + emitter.onComplete(); + } + }); + } + + public void cacheInMemory(Data data) { + this.data = data.clone(); + this.data.source = "memory"; + + } + +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java new file mode 100644 index 0000000..632fde8 --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java @@ -0,0 +1,23 @@ +package com.rxjava2.android.samples.ui.cache.source; + +import com.rxjava2.android.samples.ui.cache.model.Data; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; + +public class NetworkDataSource { + + public Observable getData() { + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + Data data = new Data(); + data.source = "network"; + emitter.onNext(data); + emitter.onComplete(); + } + }); + } + +} diff --git a/app/src/main/res/layout/activity_selection.xml b/app/src/main/res/layout/activity_selection.xml index 2c42930..999f99c 100644 --- a/app/src/main/res/layout/activity_selection.xml +++ b/app/src/main/res/layout/activity_selection.xml @@ -4,10 +4,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fadeScrollbars="false" - android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.rxjava2.android.samples.ui.SelectionActivity"> +