diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..3741d94
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,9 @@
+# Contributing
+
+1. Fork it!
+2. Checkout the development branch: `git checkout development`
+3. Create your feature branch: `git checkout -b my-new-feature`
+4. Add your changes to the index: `git add .`
+5. Commit your changes: `git commit -m 'Add some feature'`
+6. Push to the branch: `git push origin my-new-feature`
+7. Submit a pull request against the `development` branch
diff --git a/README.md b/README.md
index 209a0cb..8aa4e01 100644
--- a/README.md
+++ b/README.md
@@ -1,111 +1,112 @@
-# Learning RxJava2 for Android by example
+
-####This project is for :
+# Learning RxJava 2 for Android by example
+
+### This project is for :
* who is migrating to RxJava 2
* or just started with RxJava.
-### Just Build the project and start learning RxJava by examples.
+## About me
-RxJava 2.0 has been completely rewritten from scratch on top of the Reactive-Streams specification. The specification itself has evolved out of RxJava 1.x and provides a common baseline for reactive systems and libraries.
+Hi, I am Amit Shekhar, Founder @ [Outcome School](https://outcomeschool.com) • IIT 2010-14 • I have taught and mentored many developers, and their efforts landed them high-paying tech jobs, helped many tech companies in solving their unique problems, and created many open-source libraries being used by top companies. I am passionate about sharing knowledge through open-source, blogs, and videos.
-Because Reactive-Streams has a different architecture, it mandates changes to some well known RxJava types.
+### Follow Amit Shekhar
+- [X/Twitter](https://twitter.com/amitiitbhu)
+- [LinkedIn](https://www.linkedin.com/in/amit-shekhar-iitbhu)
+- [GitHub](https://github.com/amitshekhariitbhu)
-# Migration From RxJava 1 to RxJava 2
+### Follow Outcome School
-To allow having RxJava 1 and RxJava 2 side-by-side, RxJava 2 is under the maven coordinates
-io.reactivex.rxjava2:rxjava:2.x.y and classes are accessible below io.reactivex.
+- [YouTube](https://youtube.com/@OutcomeSchool)
+- [X/Twitter](https://x.com/outcome_school)
+- [LinkedIn](https://www.linkedin.com/company/outcomeschool)
+- [GitHub](http://github.com/OutcomeSchool)
-Users switching from 1.x to 2.x have to re-organize their imports, but carefully.
+## I teach at Outcome School
+
+- AI and Machine Learning
+- Android
+
+Join Outcome School and get a high-paying tech job: [Outcome School](https://outcomeschool.com)
+
+### Just Build the project and start learning RxJava by examples.
+
+RxJava 2.0 has been completely rewritten from scratch on top of the Reactive-Streams specification. The specification itself has evolved out of RxJava 1.x and provides a common baseline for reactive systems and libraries.
### Using RxJava 2.0 Library in your application
Add this in your build.gradle
```groovy
-compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC1'
+compile 'io.reactivex.rxjava2:rxjava:X.X.X'
```
If you are using RxAndroid also, then add the following
```groovy
-compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1'
+compile 'io.reactivex.rxjava2:rxandroid:X.X.X'
```
-# RxJava2 Examples present in this sample project
-
-* RxJava 2.0 Example using `CompositeDisposable` as `CompositeSubscription` and `Subscription` have
-been removed.
-
-* RxJava 2 Example using `Flowable`.
+# RxJava 2 Operators Examples present in this sample project:
-* RxJava 2 Example using `SingleObserver`, `CompletableObserver`.
-
-* RxJava 2 Example using RxJava2 operators such as `map, zip, take, reduce, flatMap, filter, buffer, skip, merge, concat, replay`, and much more:
-
-* RxJava 2 Android Samples using `Function` as `Func1` has been removed.
-
-* RxJava 2 Android Samples using `BiFunction` as `Func2` has been removed.
-
-* And many others android examples
-
-# Quick Look on few changes done in RxJava2 over RxJava1
-
-RxJava1 -> RxJava2
-
-* `onCompleted` -> `onComplete` - without the trailing d
-* `Func1` -> `Function`
-* `Func2` -> `BiFunction`
-* `CompositeSubscription` -> `CompositeDisposable`
-* `limit` operator has been removed - Use `take` in RxJava2
-* and much more.
-
-# Operators :
-* `Map` -> transform the items emitted by an Observable by applying a function to each item
+* `Map` -> transform the items emitted by an Observable by applying a function to each item. Blog: [RxJava Operator Map vs FlatMap](https://outcomeschool.com/blog/rxjava-map-vs-flatmap)
* `Zip` -> combine the emissions of multiple Observables together via a specified function and emit single items for each combination based on the results of this function
* `Filter` -> emit only those items from an Observable that pass a predicate test
-* `FlatMap` -> transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable
-* `Take` -> emit only the first n items emitted by an Observable
+* `FlatMap` -> transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable. Blog: [RxJava Operator Map vs FlatMap](https://outcomeschool.com/blog/rxjava-map-vs-flatmap)
+* `Take` -> emit only the first n items emitted by an Observable. [Blog for reference](https://outcomeschool.com/blog/rxjava-interval-operator)
* `Reduce` -> apply a function to each item emitted by an Observable, sequentially, and emit the final value
* `Skip` -> suppress the first n items emitted by an Observable
* `Buffer` -> periodically gather items emitted by an Observable into bundles and emit these bundles rather than emitting the items one at a time
-* `Concat` -> emit the emissions from two or more Observables without interleaving them
+* `Concat` -> emit the emissions from two or more Observables without interleaving them. [Blog for reference](https://outcomeschool.com/blog/rxjava-concat-operator)
* `Replay` -> ensure that all observers see the same sequence of emitted items, even if they subscribe after the Observable has begun emitting items
* `Merge` -> combine multiple Observables into one by merging their emissions
+* `SwitchMap` -> transform the items emitted by an Observable into Observables, and mirror those items emitted by the most-recently transformed Observable
# Highlights of the examples :
-* [DisposableExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/DisposableExampleActivity.java) - Using `CompositeDisposable`
-* [FlowableExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/FlowableExampleActivity.java) - Using `Flowable` and `reduce` operator
-* [SingleObserverExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/SingleObserverExampleActivity.java) - Using `SingleObserver`
-* [CompletableObserverActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/CompletableObserverActivity.java) - Using `CompletableObserver`
-* [MapExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/MapExampleActivity.java) - Using `map` Operator
-* [ZipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ZipExampleActivity.java) - Using `zip` Operator
-* [BufferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/BufferExampleActivity.java) - Using `buffer` Operator
-* [TakeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/TakeExampleActivity.java) - Using `take` Operator
-* [ReduceExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ReduceExampleActivity.java) - Using `reduce` Operator
-* [FilterExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/FilterExampleActivity.java) - Using `filter` Operator
-* [SkipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/SkipExampleActivity.java) - Using `skip` Operator
-* [ReplayExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ReplayExampleActivity.java) - Using `replay` Operator
-* [ConcatExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ConcatExampleActivity.java) - Using `concat` Operator
-* [MergeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/MergeExampleActivity.java) - Using `merge` Operator
-* [IntervalExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/IntervalExampleActivity.java) - Using `Interval`
-
-### TODO
-
-* Many examples are to be added
-
-### Show some :heart:
-* Be sure to click the :star: button in the upper right of this page. :v:
-
-### Contact - Let's become friend
+* [DisposableExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java) - Using `CompositeDisposable`. [Blog for reference](https://outcomeschool.com/blog/dispose-vs-clear-compositedisposable-rxjava)
+* [FlowableExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java) - Using `Flowable` and `reduce` operator
+* [SingleObserverExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java) - Using `SingleObserver`
+* [CompletableObserverActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java) - Using `CompletableObserver`
+* [MapExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java) - Using `map` Operator. Blog: [RxJava Operator Map vs FlatMap](https://outcomeschool.com/blog/rxjava-map-vs-flatmap)
+* [ZipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java) - Using `zip` Operator
+* [BufferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java) - Using `buffer` Operator
+* [TakeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java) - Using `take` Operator. [Blog for reference](https://outcomeschool.com/blog/rxjava-interval-operator)
+* [ReduceExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java) - Using `reduce` Operator
+* [FilterExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java) - Using `filter` Operator
+* [SkipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java) - Using `skip` Operator
+* [ReplayExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java) - Using `replay` Operator
+* [ConcatExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java) - Using `concat` Operator. [Blog for reference](https://outcomeschool.com/blog/rxjava-concat-operator)
+* [MergeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java) - Using `merge` Operator
+* [DeferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java) - Using `defer` Observable
+* [SwitchMapExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java) - Using `switchMap` Observable
+* [IntervalExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java) - Using `Interval`. [Blog for reference](https://outcomeschool.com/blog/rxjava-interval-operator)
+* [RxBusActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/rxbus/RxBusActivity.java) - RxBus, RxJava2Bus, EventBus, RxEventBus
+* [PaginationActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java) - Pagination for loadMore in RecyclerView. Blog: [Pagination In RecyclerView Using RxJava Operators](https://outcomeschool.com/blog/pagination-in-recyclerview-using-rxjava-operators)
+* [ComposeOperatorExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/compose/ComposeOperatorExampleActivity.java) - Compose operator for reusable
+* [Search Implementation](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/search/SearchActivity.java) - Using `debounce`, `switchMap`, `distinctUntilChanged`
+* [Implement Caching Using RxJava Operators](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java) - Using `concat`, `firstElement`
+* [PublishSubjectExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java). Blog: [RxJava Subject - Publish, Replay, Behavior, and Async](https://outcomeschool.com/blog/rxjava-subject-publish-replay-behavior-async)
+
+### Find this project useful ? :heart:
+* Support it by clicking the :star: button on the upper right of this page. :v:
+
+Thanks
+
+**Amit Shekhar**\
+Co-Founder @ [Outcome School](https://outcomeschool.com)
+
+You can connect with me on:
+
- [Twitter](https://twitter.com/amitiitbhu)
-- [Github](https://github.com/amitshekhariitbhu)
-- [Medium](https://medium.com/@amitshekhar)
+- [LinkedIn](https://www.linkedin.com/in/amit-shekhar-iitbhu)
+- [GitHub](https://github.com/amitshekhariitbhu)
- [Facebook](https://www.facebook.com/amit.shekhar.iitbhu)
+[**Read all of our blogs here.**](https://outcomeschool.com/blog)
+
### License
```
- Copyright (C) 2016 Amit Shekhar
- Copyright (C) 2011 Android Open Source Project
+ Copyright (C) 2024 Amit Shekhar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -120,7 +121,6 @@ RxJava1 -> RxJava2
limitations under the License.
```
-### Contributing to RxJava2 Android Samples
+### Contributing to RxJava 2 Android Samples
Just make pull request. You are in!
-
-
\ No newline at end of file
+
diff --git a/app/build.gradle b/app/build.gradle
index f0cb4a3..fe13a5b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 24
- buildToolsVersion "24.0.1"
+ compileSdkVersion 28
+ buildToolsVersion "28.0.2"
defaultConfig {
applicationId "com.rxjava2.android.samples"
- minSdkVersion 15
- targetSdkVersion 24
+ minSdkVersion 16
+ targetSdkVersion 28
versionCode 1
versionName "1.0"
}
@@ -17,12 +17,25 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ compileOptions {
+ sourceCompatibility = '1.8'
+ targetCompatibility = '1.8'
+ }
}
dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:24.1.1'
- compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC1'
- compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1'
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
+ androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
+ androidTestImplementation 'androidx.test:rules:1.1.0-alpha4'
+ implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
+ implementation 'androidx.recyclerview:recyclerview:1.0.0-rc02'
+
+ // RxJava2 Dependencies
+ implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
+ implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
+
+ // FastAndroidNetworking Dependency
+ implementation 'com.amitshekhar.android:rx2-android-networking:1.0.2'
}
diff --git a/app/src/androidTest/java/com/rxjava2/android/samples/ApplicationTest.java b/app/src/androidTest/java/com/rxjava2/android/samples/ApplicationTest.java
deleted file mode 100644
index ddaec0b..0000000
--- a/app/src/androidTest/java/com/rxjava2/android/samples/ApplicationTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.rxjava2.android.samples;
-
-import android.app.Application;
-import android.test.ApplicationTestCase;
-
-/**
- * Testing Fundamentals
- */
-public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9f5d05b..720343a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,71 +2,142 @@
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/MainActivity.java b/app/src/main/java/com/rxjava2/android/samples/MainActivity.java
deleted file mode 100644
index 464273d..0000000
--- a/app/src/main/java/com/rxjava2/android/samples/MainActivity.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.rxjava2.android.samples;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.view.View;
-
-public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-
- public void startSimpleActivity(View view) {
- startActivity(new Intent(MainActivity.this, SimpleExampleActivity.class));
- }
-
- public void startMapActivity(View view) {
- startActivity(new Intent(MainActivity.this, MapExampleActivity.class));
- }
-
- public void startZipActivity(View view) {
- startActivity(new Intent(MainActivity.this, ZipExampleActivity.class));
- }
-
- public void startDisposableActivity(View view) {
- startActivity(new Intent(MainActivity.this, DisposableExampleActivity.class));
- }
-
- public void startTakeActivity(View view) {
- startActivity(new Intent(MainActivity.this, TakeExampleActivity.class));
- }
-
- public void startTimerActivity(View view) {
- startActivity(new Intent(MainActivity.this, TimerExample.class));
- }
-
- public void startIntervalActivity(View view) {
- startActivity(new Intent(MainActivity.this, IntervalExampleActivity.class));
- }
-
- public void startSingleObserverActivity(View view) {
- startActivity(new Intent(MainActivity.this, SingleObserverExampleActivity.class));
- }
-
- public void startCompletableObserverActivity(View view) {
- startActivity(new Intent(MainActivity.this, CompletableObserverActivity.class));
- }
-
- public void startFlowableActivity(View view) {
- startActivity(new Intent(MainActivity.this, FlowableExampleActivity.class));
- }
-
- public void startReduceActivity(View view) {
- startActivity(new Intent(MainActivity.this, ReduceExampleActivity.class));
- }
-
- public void startBufferActivity(View view) {
- startActivity(new Intent(MainActivity.this, BufferExampleActivity.class));
- }
-
- public void startFilterActivity(View view) {
- startActivity(new Intent(MainActivity.this, FilterExampleActivity.class));
- }
-
- public void startSkipActivity(View view) {
- startActivity(new Intent(MainActivity.this, SkipExampleActivity.class));
- }
-
- public void startReplayActivity(View view) {
- startActivity(new Intent(MainActivity.this, ReplayExampleActivity.class));
- }
-
- public void startConcatActivity(View view) {
- startActivity(new Intent(MainActivity.this, ConcatExampleActivity.class));
- }
-
- public void startMergeActivity(View view) {
- startActivity(new Intent(MainActivity.this, MergeExampleActivity.class));
- }
-}
diff --git a/app/src/main/java/com/rxjava2/android/samples/MyApplication.java b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java
new file mode 100644
index 0000000..781cb30
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java
@@ -0,0 +1,42 @@
+package com.rxjava2.android.samples;
+
+import android.app.Application;
+
+import com.rxjava2.android.samples.model.Events;
+import com.rxjava2.android.samples.ui.rxbus.RxBus;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.functions.Consumer;
+
+/**
+ * Created by threshold on 2017/1/12.
+ */
+
+public class MyApplication extends Application {
+
+ public static final String TAG = "MyApplication";
+ private RxBus bus;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ bus = new RxBus();
+ }
+
+ public RxBus bus() {
+ return bus;
+ }
+
+ public void sendAutoEvent() {
+ Observable.timer(2, TimeUnit.SECONDS)
+ .subscribe(new Consumer() {
+ @Override
+ public void accept(Long aLong) {
+ bus.send(new Events.AutoEvent());
+ }
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/model/ApiUser.java b/app/src/main/java/com/rxjava2/android/samples/model/ApiUser.java
index 6335019..09039ef 100644
--- a/app/src/main/java/com/rxjava2/android/samples/model/ApiUser.java
+++ b/app/src/main/java/com/rxjava2/android/samples/model/ApiUser.java
@@ -5,6 +5,15 @@
*/
public class ApiUser {
public long id;
- public String firstName;
- public String lastName;
+ public String firstname;
+ public String lastname;
+
+ @Override
+ public String toString() {
+ return "ApiUser{" +
+ "id=" + id +
+ ", firstname='" + firstname + '\'' +
+ ", lastname='" + lastname + '\'' +
+ '}';
+ }
}
diff --git a/app/src/main/java/com/rxjava2/android/samples/model/Car.java b/app/src/main/java/com/rxjava2/android/samples/model/Car.java
new file mode 100644
index 0000000..a5ecffa
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/model/Car.java
@@ -0,0 +1,28 @@
+package com.rxjava2.android.samples.model;
+
+import java.util.concurrent.Callable;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+
+/**
+ * Created by amitshekhar on 30/08/16.
+ */
+public class Car {
+
+ private String brand;
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public Observable brandDeferObservable() {
+ return Observable.defer(new Callable>() {
+ @Override
+ public ObservableSource extends String> call() {
+ return Observable.just(brand);
+ }
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/model/Events.java b/app/src/main/java/com/rxjava2/android/samples/model/Events.java
new file mode 100644
index 0000000..d4541b4
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/model/Events.java
@@ -0,0 +1,21 @@
+package com.rxjava2.android.samples.model;
+
+/**
+ * Created by amitshekhar on 06/02/17.
+ */
+
+public class Events {
+
+ private Events() {
+
+ }
+
+ public static class TapEvent {
+
+ }
+
+ public static class AutoEvent {
+
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/model/User.java b/app/src/main/java/com/rxjava2/android/samples/model/User.java
index de5a522..6fb84ad 100644
--- a/app/src/main/java/com/rxjava2/android/samples/model/User.java
+++ b/app/src/main/java/com/rxjava2/android/samples/model/User.java
@@ -5,6 +5,44 @@
*/
public class User {
public long id;
- public String firstName;
- public String lastName;
+ public String firstname;
+ public String lastname;
+ public boolean isFollowing;
+
+ public User() {
+ }
+
+ public User(ApiUser apiUser) {
+ this.id = apiUser.id;
+ this.firstname = apiUser.firstname;
+ this.lastname = apiUser.lastname;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "id=" + id +
+ ", firstname='" + firstname + '\'' +
+ ", lastname='" + lastname + '\'' +
+ ", isFollowing=" + isFollowing +
+ '}';
+ }
+
+ @Override
+ public int hashCode() {
+ return (int) id + firstname.hashCode() + lastname.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof User) {
+ User user = (User) obj;
+
+ return this.id == user.id
+ && this.firstname.equals(user.firstname)
+ && this.lastname.equals(user.lastname);
+ }
+
+ return false;
+ }
}
diff --git a/app/src/main/java/com/rxjava2/android/samples/model/UserDetail.java b/app/src/main/java/com/rxjava2/android/samples/model/UserDetail.java
new file mode 100644
index 0000000..1be734b
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/model/UserDetail.java
@@ -0,0 +1,21 @@
+package com.rxjava2.android.samples.model;
+
+/**
+ * Created by amitshekhar on 04/02/17.
+ */
+
+public class UserDetail {
+
+ public long id;
+ public String firstname;
+ public String lastname;
+
+ @Override
+ public String toString() {
+ return "UserDetail{" +
+ "id=" + id +
+ ", firstname='" + firstname + '\'' +
+ ", lastname='" + lastname + '\'' +
+ '}';
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java
new file mode 100644
index 0000000..3986c9a
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java
@@ -0,0 +1,183 @@
+package com.rxjava2.android.samples.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import com.rxjava2.android.samples.R;
+import com.rxjava2.android.samples.ui.operators.AsyncSubjectExampleActivity;
+import com.rxjava2.android.samples.ui.operators.BehaviorSubjectExampleActivity;
+import com.rxjava2.android.samples.ui.operators.BufferExampleActivity;
+import com.rxjava2.android.samples.ui.operators.CompletableObserverExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ConcatExampleActivity;
+import com.rxjava2.android.samples.ui.operators.DebounceExampleActivity;
+import com.rxjava2.android.samples.ui.operators.DeferExampleActivity;
+import com.rxjava2.android.samples.ui.operators.DelayExampleActivity;
+import com.rxjava2.android.samples.ui.operators.DisposableExampleActivity;
+import com.rxjava2.android.samples.ui.operators.DistinctExampleActivity;
+import com.rxjava2.android.samples.ui.operators.FilterExampleActivity;
+import com.rxjava2.android.samples.ui.operators.FlowableExampleActivity;
+import com.rxjava2.android.samples.ui.operators.IntervalExampleActivity;
+import com.rxjava2.android.samples.ui.operators.LastOperatorExampleActivity;
+import com.rxjava2.android.samples.ui.operators.MapExampleActivity;
+import com.rxjava2.android.samples.ui.operators.MergeExampleActivity;
+import com.rxjava2.android.samples.ui.operators.PublishSubjectExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ReduceExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ReplayExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ReplaySubjectExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ScanExampleActivity;
+import com.rxjava2.android.samples.ui.operators.SimpleExampleActivity;
+import com.rxjava2.android.samples.ui.operators.SingleObserverExampleActivity;
+import com.rxjava2.android.samples.ui.operators.SkipExampleActivity;
+import com.rxjava2.android.samples.ui.operators.SwitchMapExampleActivity;
+import com.rxjava2.android.samples.ui.operators.TakeExampleActivity;
+import com.rxjava2.android.samples.ui.operators.TakeUntilExampleActivity;
+import com.rxjava2.android.samples.ui.operators.TakeWhileExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ThrottleFirstExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ThrottleLastExampleActivity;
+import com.rxjava2.android.samples.ui.operators.TimerExampleActivity;
+import com.rxjava2.android.samples.ui.operators.WindowExampleActivity;
+import com.rxjava2.android.samples.ui.operators.ZipExampleActivity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class OperatorsActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_operators);
+ }
+
+ public void startSimpleActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, SimpleExampleActivity.class));
+ }
+
+ public void startMapActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, MapExampleActivity.class));
+ }
+
+ public void startZipActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ZipExampleActivity.class));
+ }
+
+ public void startDisposableActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, DisposableExampleActivity.class));
+ }
+
+ public void startTakeActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, TakeExampleActivity.class));
+ }
+
+ public void startTimerActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, TimerExampleActivity.class));
+ }
+
+ public void startIntervalActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, IntervalExampleActivity.class));
+ }
+
+ public void startSingleObserverActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, SingleObserverExampleActivity.class));
+ }
+
+ public void startCompletableObserverActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, CompletableObserverExampleActivity.class));
+ }
+
+ public void startFlowableActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, FlowableExampleActivity.class));
+ }
+
+ public void startReduceActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ReduceExampleActivity.class));
+ }
+
+ public void startBufferActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, BufferExampleActivity.class));
+ }
+
+ public void startFilterActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, FilterExampleActivity.class));
+ }
+
+ public void startSkipActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, SkipExampleActivity.class));
+ }
+
+ public void startScanActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ScanExampleActivity.class));
+ }
+
+ public void startReplayActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ReplayExampleActivity.class));
+ }
+
+ public void startConcatActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ConcatExampleActivity.class));
+ }
+
+ public void startMergeActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, MergeExampleActivity.class));
+ }
+
+ public void startDeferActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, DeferExampleActivity.class));
+ }
+
+ public void startDistinctActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, DistinctExampleActivity.class));
+ }
+
+ public void startLastOperatorActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, LastOperatorExampleActivity.class));
+ }
+
+ public void startReplaySubjectActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ReplaySubjectExampleActivity.class));
+ }
+
+ public void startPublishSubjectActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, PublishSubjectExampleActivity.class));
+ }
+
+ public void startBehaviorSubjectActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, BehaviorSubjectExampleActivity.class));
+ }
+
+ public void startAsyncSubjectActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, AsyncSubjectExampleActivity.class));
+ }
+
+ public void startThrottleFirstActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this,ThrottleFirstExampleActivity.class));
+ }
+
+ public void startThrottleLastActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, ThrottleLastExampleActivity.class));
+ }
+
+ public void startDebounceActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, DebounceExampleActivity.class));
+ }
+
+ public void startWindowActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this,WindowExampleActivity.class));
+ }
+
+ public void startDelayActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this,DelayExampleActivity.class));
+ }
+
+ public void startSwitchMapActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, SwitchMapExampleActivity.class));
+ }
+
+ public void startTakeWhileActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, TakeWhileExampleActivity.class));
+ }
+
+ public void startTakeUntilActivity(View view) {
+ startActivity(new Intent(OperatorsActivity.this, TakeUntilExampleActivity.class));
+ }
+}
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
new file mode 100644
index 0000000..fd392dd
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java
@@ -0,0 +1,55 @@
+package com.rxjava2.android.samples.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+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;
+import com.rxjava2.android.samples.ui.rxbus.RxBusActivity;
+import com.rxjava2.android.samples.ui.search.SearchActivity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class SelectionActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_selection);
+ }
+
+ public void startOperatorsActivity(View view) {
+ startActivity(new Intent(SelectionActivity.this, OperatorsActivity.class));
+ }
+
+ 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));
+ }
+
+ public void startPaginationActivity(View view) {
+ startActivity(new Intent(SelectionActivity.this, PaginationActivity.class));
+ }
+
+ public void startComposeOperator(View view) {
+ startActivity(new Intent(SelectionActivity.this, ComposeOperatorExampleActivity.class));
+ }
+
+ public void startSearchActivity(View view) {
+ startActivity(new Intent(SelectionActivity.this, SearchActivity.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..bd98f63
--- /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.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 androidx.appcompat.app.AppCompatActivity;
+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..23403ff
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java
@@ -0,0 +1,41 @@
+package com.rxjava2.android.samples.ui.cache.source;
+
+import com.rxjava2.android.samples.ui.cache.model.Data;
+
+import io.reactivex.Observable;
+
+/**
+ * The DataSource to handle 3 data sources - memory, disk, network
+ */
+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(data ->
+ memoryDataSource.cacheInMemory(data)
+ );
+ }
+
+ public Observable getDataFromNetwork() {
+ return networkDataSource.getData().doOnNext(data -> {
+ 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..29f5bfa
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java
@@ -0,0 +1,28 @@
+package com.rxjava2.android.samples.ui.cache.source;
+
+import com.rxjava2.android.samples.ui.cache.model.Data;
+
+import io.reactivex.Observable;
+
+/**
+ * Class to simulate Disk DataSource
+ */
+public class DiskDataSource {
+
+ private Data data;
+
+ public Observable getData() {
+ return Observable.create(emitter -> {
+ 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..2742f26
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java
@@ -0,0 +1,28 @@
+package com.rxjava2.android.samples.ui.cache.source;
+
+import com.rxjava2.android.samples.ui.cache.model.Data;
+
+import io.reactivex.Observable;
+
+/**
+ * Class to simulate InMemory DataSource
+ */
+public class MemoryDataSource {
+
+ private Data data;
+
+ public Observable getData() {
+ return Observable.create(emitter -> {
+ 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..d903fb0
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java
@@ -0,0 +1,22 @@
+package com.rxjava2.android.samples.ui.cache.source;
+
+import com.rxjava2.android.samples.ui.cache.model.Data;
+
+import io.reactivex.Observable;
+
+
+/**
+ * Class to simulate Network DataSource
+ */
+public class NetworkDataSource {
+
+ public Observable getData() {
+ return Observable.create(emitter -> {
+ Data data = new Data();
+ data.source = "network";
+ emitter.onNext(data);
+ emitter.onComplete();
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/compose/ComposeOperatorExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/compose/ComposeOperatorExampleActivity.java
new file mode 100644
index 0000000..89ab45b
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/compose/ComposeOperatorExampleActivity.java
@@ -0,0 +1,32 @@
+package com.rxjava2.android.samples.ui.compose;
+
+import android.os.Bundle;
+
+import com.rxjava2.android.samples.R;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Flowable;
+import io.reactivex.Observable;
+
+public class ComposeOperatorExampleActivity extends AppCompatActivity {
+
+ private RxSchedulers schedulers = new RxSchedulers();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_compose_operator_example);
+
+ /*
+ Compose for reusable code.
+ */
+ Observable.just(1, 2, 3, 4, 5)
+ .compose(schedulers.applyObservableAsync())
+ .subscribe(/* */);
+
+ Flowable.just(1, 2, 3, 4, 5)
+ .compose(schedulers.applyFlowableAsysnc())
+ .subscribe(/* */);
+
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/compose/RxSchedulers.java b/app/src/main/java/com/rxjava2/android/samples/ui/compose/RxSchedulers.java
new file mode 100644
index 0000000..6be576c
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/compose/RxSchedulers.java
@@ -0,0 +1,75 @@
+package com.rxjava2.android.samples.ui.compose;
+
+import org.reactivestreams.Publisher;
+
+import io.reactivex.Flowable;
+import io.reactivex.FlowableTransformer;
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+import io.reactivex.ObservableTransformer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by werockstar on 5/19/2017.
+ */
+
+public class RxSchedulers {
+
+ public ObservableTransformer applyObservableAsync() {
+ return new ObservableTransformer() {
+ @Override
+ public ObservableSource apply(Observable observable) {
+ return observable.subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+ public ObservableTransformer applyObservableCompute() {
+ return new ObservableTransformer() {
+ @Override
+ public ObservableSource apply(Observable observable) {
+ return observable.subscribeOn(Schedulers.computation())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+ public ObservableTransformer applyObservableMainThread() {
+ return new ObservableTransformer() {
+ @Override
+ public ObservableSource apply(Observable observable) {
+ return observable.observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+ public FlowableTransformer applyFlowableMainThread() {
+ return new FlowableTransformer() {
+ @Override
+ public Publisher apply(Flowable flowable) {
+ return flowable.observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+ public FlowableTransformer applyFlowableAsysnc() {
+ return new FlowableTransformer() {
+ @Override
+ public Publisher apply(Flowable flowable) {
+ return flowable.observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+ public FlowableTransformer applyFlowableCompute() {
+ return new FlowableTransformer() {
+ @Override
+ public Publisher apply(Flowable flowable) {
+ return flowable.observeOn(AndroidSchedulers.mainThread());
+ }
+ };
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java
new file mode 100644
index 0000000..6878e3a
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java
@@ -0,0 +1,389 @@
+package com.rxjava2.android.samples.ui.networking;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.util.Pair;
+import android.view.View;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.rx2androidnetworking.Rx2AndroidNetworking;
+import com.rxjava2.android.samples.R;
+import com.rxjava2.android.samples.model.ApiUser;
+import com.rxjava2.android.samples.model.User;
+import com.rxjava2.android.samples.model.UserDetail;
+import com.rxjava2.android.samples.utils.Utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.BiFunction;
+import io.reactivex.functions.Function;
+import io.reactivex.functions.Predicate;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by amitshekhar on 04/02/17.
+ */
+
+public class NetworkingActivity extends AppCompatActivity {
+
+ public static final String TAG = NetworkingActivity.class.getSimpleName();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_networking);
+ }
+
+ /**
+ * Map Operator Example
+ */
+ public void map(View view) {
+ Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUser/{userId}")
+ .addPathParameter("userId", "1")
+ .build()
+ .getObjectObservable(ApiUser.class)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .map(new Function() {
+ @Override
+ public User apply(ApiUser apiUser) {
+ // here we get ApiUser from server
+ User user = new User(apiUser);
+ // then by converting, we are returning user
+ return user;
+ }
+ })
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(User user) {
+ Log.d(TAG, "user : " + user.toString());
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, "onComplete");
+ }
+ });
+ }
+
+
+ /**
+ * zip Operator Example
+ */
+
+ /**
+ * This observable return the list of User who loves cricket
+ */
+ private Observable> getCricketFansObservable() {
+ return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllCricketFans")
+ .build()
+ .getObjectListObservable(User.class)
+ .subscribeOn(Schedulers.io());
+ }
+
+ /*
+ * This observable return the list of User who loves Football
+ */
+ private Observable> getFootballFansObservable() {
+ return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllFootballFans")
+ .build()
+ .getObjectListObservable(User.class)
+ .subscribeOn(Schedulers.io());
+ }
+
+ /*
+ * This do the complete magic, make both network call
+ * and then returns the list of user who loves both
+ * Using zip operator to get both response at a time
+ */
+ private void findUsersWhoLovesBoth() {
+ // here we are using zip operator to combine both request
+ Observable.zip(getCricketFansObservable(), getFootballFansObservable(),
+ new BiFunction, List, List>() {
+ @Override
+ public List apply(List cricketFans, List footballFans) {
+ List userWhoLovesBoth =
+ filterUserWhoLovesBoth(cricketFans, footballFans);
+ return userWhoLovesBoth;
+ }
+ })
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(List users) {
+ // do anything with user who loves both
+ Log.d(TAG, "userList size : " + users.size());
+ for (User user : users) {
+ Log.d(TAG, "user : " + user.toString());
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, "onComplete");
+ }
+ });
+ }
+
+ private List filterUserWhoLovesBoth(List cricketFans, List footballFans) {
+ List userWhoLovesBoth = new ArrayList<>();
+
+ for (User footballFan : footballFans) {
+ if (cricketFans.contains(footballFan)) {
+ userWhoLovesBoth.add(footballFan);
+ }
+ }
+
+ return userWhoLovesBoth;
+ }
+
+
+ public void zip(View view) {
+ findUsersWhoLovesBoth();
+ }
+
+
+ /**
+ * flatMap and filter Operators Example
+ */
+
+ private Observable> getAllMyFriendsObservable() {
+ return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllFriends/{userId}")
+ .addPathParameter("userId", "1")
+ .build()
+ .getObjectListObservable(User.class);
+ }
+
+ public void flatMapAndFilter(View view) {
+ getAllMyFriendsObservable()
+ .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one
+ @Override
+ public ObservableSource apply(List usersList) {
+ return Observable.fromIterable(usersList); // returning user one by one from usersList.
+ }
+ })
+ .filter(new Predicate() {
+ @Override
+ public boolean test(User user) {
+ // filtering user who follows me.
+ return user.isFollowing;
+ }
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(User user) {
+ // only the user who is following me comes here one by one
+ Log.d(TAG, "user : " + user.toString());
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, "onComplete");
+ }
+ });
+ }
+
+
+ /**
+ * take Operator Example
+ */
+
+ public void take(View view) {
+ getUserListObservable()
+ .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one
+ @Override
+ public ObservableSource apply(List usersList) {
+ return Observable.fromIterable(usersList); // returning user one by one from usersList.
+ }
+ })
+ .take(4) // it will only emit first 4 users out of all
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(User user) {
+ // // only four user comes here one by one
+ Log.d(TAG, "user : " + user.toString());
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, "onComplete");
+ }
+ });
+ }
+
+
+ /**
+ * flatMap Operator Example
+ */
+
+ public void flatMap(View view) {
+ getUserListObservable()
+ .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one
+ @Override
+ public ObservableSource apply(List usersList) {
+ return Observable.fromIterable(usersList); // returning user one by one from usersList.
+ }
+ })
+ .flatMap(new Function>() {
+ @Override
+ public ObservableSource apply(User user) {
+ // here we get the user one by one
+ // and returns corresponding getUserDetailObservable
+ // for that userId
+ return getUserDetailObservable(user.id);
+ }
+ })
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onNext(UserDetail userDetail) {
+ // do anything with userDetail
+ Log.d(TAG, "userDetail : " + userDetail.toString());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, "onComplete");
+ }
+ });
+ }
+
+ /**
+ * flatMapWithZip Operator Example
+ */
+
+ private Observable> getUserListObservable() {
+ return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")
+ .addPathParameter("pageNumber", "0")
+ .addQueryParameter("limit", "10")
+ .build()
+ .getObjectListObservable(User.class);
+ }
+
+ private Observable getUserDetailObservable(long id) {
+ return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUserDetail/{userId}")
+ .addPathParameter("userId", String.valueOf(id))
+ .build()
+ .getObjectObservable(UserDetail.class);
+ }
+
+ public void flatMapWithZip(View view) {
+ getUserListObservable()
+ .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one
+ @Override
+ public ObservableSource apply(List usersList) {
+ return Observable.fromIterable(usersList); // returning user one by one from usersList.
+ }
+ })
+ .flatMap(new Function>>() {
+ @Override
+ public ObservableSource> apply(User user) {
+ // here we get the user one by one and then we are zipping
+ // two observable - one getUserDetailObservable (network call to get userDetail)
+ // and another Observable.just(user) - just to emit user
+ return Observable.zip(getUserDetailObservable(user.id),
+ Observable.just(user),
+ new BiFunction>() {
+ @Override
+ public Pair apply(UserDetail userDetail, User user) {
+ // runs when network call completes
+ // we get here userDetail for the corresponding user
+ return new Pair<>(userDetail, user); // returning the pair(userDetail, user)
+ }
+ });
+ }
+ })
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer>() {
+ @Override
+ public void onComplete() {
+ // do something onCompleted
+ Log.d(TAG, "onComplete");
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ // handle error
+ Utils.logError(TAG, e);
+ }
+
+ @Override
+ public void onSubscribe(Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(Pair pair) {
+ // here we are getting the userDetail for the corresponding user one by one
+ UserDetail userDetail = pair.first;
+ User user = pair.second;
+ Log.d(TAG, "user : " + user.toString());
+ Log.d(TAG, "userDetail : " + userDetail.toString());
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java
new file mode 100644
index 0000000..d2243a2
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java
@@ -0,0 +1,132 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.subjects.AsyncSubject;
+
+/**
+ * Created by amitshekhar on 17/12/16.
+ */
+
+public class AsyncSubjectExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = AsyncSubjectExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* An AsyncSubject emits the last value (and only the last value) emitted by the source
+ * Observable, and only after that source Observable completes. (If the source Observable
+ * does not emit any values, the AsyncSubject also completes without emitting any values.)
+ */
+ private void doSomeWork() {
+
+ AsyncSubject source = AsyncSubject.create();
+
+ source.subscribe(getFirstObserver()); // it will emit only 4 and onComplete
+
+ source.onNext(1);
+ source.onNext(2);
+ source.onNext(3);
+
+ /*
+ * it will emit 4 and onComplete for second observer also.
+ */
+ source.subscribe(getSecondObserver());
+
+ source.onNext(4);
+ source.onComplete();
+
+ }
+
+
+ private Observer getFirstObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " First onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" First onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" First onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" First onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onComplete");
+ }
+ };
+ }
+
+ private Observer getSecondObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ textView.append(" Second onSubscribe : isDisposed :" + d.isDisposed());
+ Log.d(TAG, " Second onSubscribe : " + d.isDisposed());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" Second onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" Second onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" Second onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onComplete");
+ }
+ };
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java
new file mode 100644
index 0000000..9eeadd0
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java
@@ -0,0 +1,134 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.subjects.BehaviorSubject;
+
+/**
+ * Created by amitshekhar on 17/12/16.
+ */
+
+public class BehaviorSubjectExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = BehaviorSubjectExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* When an observer subscribes to a BehaviorSubject, it begins by emitting the item most
+ * recently emitted by the source Observable (or a seed/default value if none has yet been
+ * emitted) and then continues to emit any other items emitted later by the source Observable(s).
+ * It is different from Async Subject as async emits the last value (and only the last value)
+ * but the Behavior Subject emits the last and the subsequent values also.
+ */
+ private void doSomeWork() {
+
+ BehaviorSubject source = BehaviorSubject.create();
+
+ source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4 and onComplete
+
+ source.onNext(1);
+ source.onNext(2);
+ source.onNext(3);
+
+ /*
+ * it will emit 3(last emitted), 4 and onComplete for second observer also.
+ */
+ source.subscribe(getSecondObserver());
+
+ source.onNext(4);
+ source.onComplete();
+
+ }
+
+
+ private Observer getFirstObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " First onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" First onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" First onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" First onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onComplete");
+ }
+ };
+ }
+
+ private Observer getSecondObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ textView.append(" Second onSubscribe : isDisposed :" + d.isDisposed());
+ Log.d(TAG, " Second onSubscribe : " + d.isDisposed());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" Second onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" Second onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" Second onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onComplete");
+ }
+ };
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/BufferExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
similarity index 83%
rename from app/src/main/java/com/rxjava2/android/samples/BufferExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
index e106ffa..9171136 100644
--- a/app/src/main/java/com/rxjava2/android/samples/BufferExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
@@ -1,14 +1,17 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
import java.util.List;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
@@ -26,8 +29,8 @@ public class BufferExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -65,16 +68,17 @@ private Observer> getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(List stringList) {
textView.append(" onNext size : " + stringList.size());
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : size :" + stringList.size());
for (String value : stringList) {
textView.append(" value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " : value :" + value);
}
@@ -83,12 +87,14 @@ public void onNext(List stringList) {
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/CompletableObserverActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
similarity index 76%
rename from app/src/main/java/com/rxjava2/android/samples/CompletableObserverActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
index 301b13b..4ee612f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/CompletableObserverActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
@@ -1,14 +1,17 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
import java.util.concurrent.TimeUnit;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Completable;
import io.reactivex.CompletableObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -18,9 +21,9 @@
/**
* Created by amitshekhar on 27/08/16.
*/
-public class CompletableObserverActivity extends AppCompatActivity {
+public class CompletableObserverExampleActivity extends AppCompatActivity {
- private static final String TAG = CompletableObserverActivity.class.getSimpleName();
+ private static final String TAG = CompletableObserverExampleActivity.class.getSimpleName();
Button btn;
TextView textView;
@@ -28,8 +31,8 @@ public class CompletableObserverActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -56,19 +59,20 @@ private CompletableObserver getCompletableObserver() {
return new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onComplete() {
textView.append(" onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onComplete");
}
@Override
public void onError(Throwable e) {
textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onError : " + e.getMessage());
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ConcatExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
similarity index 84%
rename from app/src/main/java/com/rxjava2/android/samples/ConcatExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
index c924ee4..8bb3e2b 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ConcatExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
@@ -24,8 +27,8 @@ public class ConcatExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -60,25 +63,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(String value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java
new file mode 100644
index 0000000..7837381
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java
@@ -0,0 +1,116 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.concurrent.TimeUnit;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by amitshekhar on 22/12/16.
+ */
+
+public class DebounceExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = DebounceExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * Using debounce() -> only emit an item from an Observable if a particular time-span has
+ * passed without it emitting another item, so it will emit 2, 4, 5 as we have simulated it.
+ */
+ private void doSomeWork() {
+ getObservable()
+ .debounce(500, TimeUnit.MILLISECONDS)
+ // Run on a background thread
+ .subscribeOn(Schedulers.io())
+ // Be notified on the main thread
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.create(new ObservableOnSubscribe() {
+ @Override
+ public void subscribe(ObservableEmitter emitter) throws Exception {
+ // send events with simulated time wait
+ emitter.onNext(1); // skip
+ Thread.sleep(400);
+ emitter.onNext(2); // deliver
+ Thread.sleep(505);
+ emitter.onNext(3); // skip
+ Thread.sleep(100);
+ emitter.onNext(4); // deliver
+ Thread.sleep(605);
+ emitter.onNext(5); // deliver
+ Thread.sleep(510);
+ emitter.onComplete();
+ }
+ });
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : ");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ textView.append(" value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext ");
+ Log.d(TAG, " value : " + value);
+ }
+
+ @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/operators/DeferExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java
new file mode 100644
index 0000000..0e6249c
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java
@@ -0,0 +1,91 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.model.Car;
+import com.rxjava2.android.samples.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+
+/**
+ * Created by amitshekhar on 30/08/16.
+ */
+public class DeferExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = DeferExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * Defer used for Deferring Observable code until subscription in RxJava
+ */
+ private void doSomeWork() {
+
+ Car car = new Car();
+
+ Observable brandDeferObservable = car.brandDeferObservable();
+
+ car.setBrand("BMW"); // Even if we are setting the brand after creating Observable
+ // we will get the brand as BMW.
+ // If we had not used defer, we would have got null as the brand.
+
+ brandDeferObservable
+ .subscribe(getObserver());
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext : value : " + value);
+ }
+
+ @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/operators/DelayExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DelayExampleActivity.java
new file mode 100644
index 0000000..212092c
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DelayExampleActivity.java
@@ -0,0 +1,94 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.concurrent.TimeUnit;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by amitshekhar on 05/03/17.
+ */
+
+public class DelayExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = DelayExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * simple example using delay to emit after 2 second
+ */
+ private void doSomeWork() {
+ getObservable().delay(2, TimeUnit.SECONDS)
+ // Run on a background thread
+ .subscribeOn(Schedulers.io())
+ // Be notified on the main thread
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.just("Amit");
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext : value : " + value);
+ }
+
+ @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/DisposableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
similarity index 84%
rename from app/src/main/java/com/rxjava2/android/samples/DisposableExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
index c37ad99..9e51b3c 100644
--- a/app/src/main/java/com/rxjava2/android/samples/DisposableExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
@@ -1,15 +1,18 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
import android.os.Bundle;
import android.os.SystemClock;
-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.utils.AppConstant;
+
import java.util.concurrent.Callable;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -31,8 +34,8 @@ public class DisposableExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -62,18 +65,21 @@ void doSomeWork() {
@Override
public void onComplete() {
textView.append(" onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onComplete");
}
@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 onNext(String value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext value : " + value);
}
}));
@@ -82,7 +88,7 @@ public void onNext(String value) {
static Observable sampleObservable() {
return Observable.defer(new Callable>() {
@Override
- public ObservableSource extends String> call() throws Exception {
+ public ObservableSource extends String> call() {
// Do some long running operation
SystemClock.sleep(2000);
return Observable.just("one", "two", "three", "four", "five");
@@ -90,4 +96,3 @@ public ObservableSource extends String> call() throws Exception {
});
}
}
-
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java
new file mode 100644
index 0000000..af2c0e3
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java
@@ -0,0 +1,83 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+
+/**
+ * Created by techteam on 13/09/16.
+ */
+public class DistinctExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = DistinctExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * distinct() suppresses duplicate items emitted by the source Observable.
+ */
+ private void doSomeWork() {
+
+ getObservable()
+ .distinct()
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.just(1, 2, 1, 1, 2, 3, 4, 6, 4);
+ }
+
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ Log.d(TAG, " onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.d(TAG, " onComplete");
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/FilterExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
similarity index 78%
rename from app/src/main/java/com/rxjava2/android/samples/FilterExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
index 14ebb46..35ddf9a 100644
--- a/app/src/main/java/com/rxjava2/android/samples/FilterExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
@@ -1,17 +1,21 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Predicate;
+
/**
* Created by amitshekhar on 27/08/16.
*/
@@ -25,8 +29,8 @@ public class FilterExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -44,7 +48,7 @@ private void doSomeWork() {
Observable.just(1, 2, 3, 4, 5, 6)
.filter(new Predicate() {
@Override
- public boolean test(Integer integer) throws Exception {
+ public boolean test(Integer integer) {
return integer % 2 == 0;
}
})
@@ -57,14 +61,15 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(Integer value) {
textView.append(" onNext : ");
+ textView.append(AppConstant.LINE_SEPARATOR);
textView.append(" value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext ");
Log.d(TAG, " value : " + value);
}
@@ -72,12 +77,14 @@ public void onNext(Integer value) {
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/FlowableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
similarity index 63%
rename from app/src/main/java/com/rxjava2/android/samples/FlowableExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
index d3de041..2bf727f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/FlowableExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
@@ -1,15 +1,19 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Flowable;
+import io.reactivex.SingleObserver;
+import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiFunction;
-import io.reactivex.subscribers.DefaultSubscriber;
/**
* Created by amitshekhar on 27/08/16.
@@ -24,8 +28,8 @@ public class FlowableExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -51,24 +55,26 @@ public Integer apply(Integer t1, Integer t2) {
}
- private DefaultSubscriber getObserver() {
- return new DefaultSubscriber() {
+ private SingleObserver getObserver() {
+
+ return new SingleObserver() {
@Override
- public void onComplete() {
- textView.append(" onComplete");
- Log.d(TAG, " onComplete");
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
- public void onError(Throwable e) {
- textView.append(" onError : " + e.getMessage());
- Log.d(TAG, " onError : " + e.getMessage());
+ public void onSuccess(Integer value) {
+ textView.append(" onSuccess : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onSuccess : value : " + value);
}
@Override
- public void onNext(Integer value) {
- textView.append(" onNext : value : " + value);
- Log.d(TAG, " onNext value : " + value);
+ public void onError(Throwable e) {
+ textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onError : " + e.getMessage());
}
};
}
diff --git a/app/src/main/java/com/rxjava2/android/samples/IntervalExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
similarity index 84%
rename from app/src/main/java/com/rxjava2/android/samples/IntervalExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
index a2e163f..36baeaf 100644
--- a/app/src/main/java/com/rxjava2/android/samples/IntervalExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
@@ -1,14 +1,17 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
import java.util.concurrent.TimeUnit;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
@@ -29,8 +32,8 @@ public class IntervalExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -69,18 +72,21 @@ private DisposableObserver getObserver() {
@Override
public void onNext(Long value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java
new file mode 100644
index 0000000..5cc3087
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java
@@ -0,0 +1,79 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.SingleObserver;
+import io.reactivex.disposables.Disposable;
+
+/**
+ * Created by techteam on 13/09/16.
+ */
+public class LastOperatorExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = DistinctExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * last() emits only the last item emitted by the Observable.
+ */
+ private void doSomeWork() {
+ getObservable().last("A1") // the default item ("A1") to emit if the source ObservableSource is empty
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.just("A1", "A2", "A3", "A4", "A5", "A6");
+ }
+
+ private SingleObserver getObserver() {
+ return new SingleObserver() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onSuccess(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
+
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onError : " + e.getMessage());
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/MapExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
similarity index 83%
rename from app/src/main/java/com/rxjava2/android/samples/MapExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
index 25d07b9..29794ca 100644
--- a/app/src/main/java/com/rxjava2/android/samples/MapExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
@@ -1,18 +1,20 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.model.ApiUser;
import com.rxjava2.android.samples.model.User;
+import com.rxjava2.android.samples.utils.AppConstant;
import com.rxjava2.android.samples.utils.Utils;
import java.util.List;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
@@ -35,8 +37,8 @@ public class MapExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -61,7 +63,7 @@ private void doSomeWork() {
.map(new Function, List>() {
@Override
- public List apply(List apiUsers) throws Exception {
+ public List apply(List apiUsers) {
return Utils.convertApiUserListToUserList(apiUsers);
}
})
@@ -71,8 +73,8 @@ public List apply(List apiUsers) throws Exception {
private Observable> getObservable() {
return Observable.create(new ObservableOnSubscribe>() {
@Override
- public void subscribe(ObservableEmitter> e) throws Exception {
- if (!e.isCancelled()) {
+ public void subscribe(ObservableEmitter> e) {
+ if (!e.isDisposed()) {
e.onNext(Utils.getApiUserList());
e.onComplete();
}
@@ -85,15 +87,16 @@ private Observer> getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(List userList) {
textView.append(" onNext");
+ textView.append(AppConstant.LINE_SEPARATOR);
for (User user : userList) {
- textView.append(" firstName : " + user.firstName);
+ textView.append(" firstname : " + user.firstname);
+ textView.append(AppConstant.LINE_SEPARATOR);
}
Log.d(TAG, " onNext : " + userList.size());
}
@@ -101,12 +104,14 @@ public void onNext(List userList) {
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/MergeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
similarity index 80%
rename from app/src/main/java/com/rxjava2/android/samples/MergeExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
index b90dc11..01551bf 100644
--- a/app/src/main/java/com/rxjava2/android/samples/MergeExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
@@ -24,8 +27,8 @@ public class MergeExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -36,7 +39,7 @@ public void onClick(View view) {
}
/*
- * Using merge operator to combine Observable : merge maintain does not
+ * Using merge operator to combine Observable : merge does not maintain
* the order of Observable.
* It will emit all the 7 values may not be in order
* Ex - "A1", "B1", "A2", "A3", "A4", "B2", "B3" - may be anything
@@ -58,25 +61,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(String value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java
new file mode 100644
index 0000000..d03266b
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java
@@ -0,0 +1,131 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.subjects.PublishSubject;
+
+/**
+ * Created by amitshekhar on 17/12/16.
+ */
+
+public class PublishSubjectExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = PublishSubjectExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* PublishSubject emits to an observer only those items that are emitted
+ * by the source Observable, subsequent to the time of the subscription.
+ */
+ private void doSomeWork() {
+
+ PublishSubject source = PublishSubject.create();
+
+ source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4 and onComplete
+
+ source.onNext(1);
+ source.onNext(2);
+ source.onNext(3);
+
+ /*
+ * it will emit 4 and onComplete for second observer also.
+ */
+ source.subscribe(getSecondObserver());
+
+ source.onNext(4);
+ source.onComplete();
+
+ }
+
+
+ private Observer getFirstObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " First onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" First onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" First onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" First onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onComplete");
+ }
+ };
+ }
+
+ private Observer getSecondObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ textView.append(" Second onSubscribe : isDisposed :" + d.isDisposed());
+ Log.d(TAG, " Second onSubscribe : " + d.isDisposed());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" Second onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" Second onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" Second onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onComplete");
+ }
+ };
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ReduceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
similarity index 69%
rename from app/src/main/java/com/rxjava2/android/samples/ReduceExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
index 8667a3c..aa8aec1 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ReduceExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
@@ -1,14 +1,17 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.MaybeObserver;
import io.reactivex.Observable;
-import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiFunction;
@@ -25,8 +28,8 @@ public class ReduceExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -46,37 +49,39 @@ private void doSomeWork() {
public Integer apply(Integer t1, Integer t2) {
return t1 + t2;
}
- }).subscribe(getObserver());
+ })
+ .subscribe(getObserver());
}
private Observable getObservable() {
return Observable.just(1, 2, 3, 4);
}
- private Observer getObserver() {
- return new Observer() {
-
+ private MaybeObserver getObserver() {
+ return new MaybeObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
- public void onNext(Integer value) {
- textView.append(" onNext : value : " + value);
- Log.d(TAG, " onNext : value : " + value);
+ public void onSuccess(Integer value) {
+ textView.append(" onSuccess : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onSuccess : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ReplayExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
similarity index 86%
rename from app/src/main/java/com/rxjava2/android/samples/ReplayExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
index f1b174c..c1ce888 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ReplayExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.observables.ConnectableObservable;
@@ -25,8 +28,8 @@ public class ReplayExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -66,25 +69,27 @@ private Observer getFirstObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" First onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " First onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(Integer value) {
textView.append(" First onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " First onNext value : " + value);
}
@Override
public void onError(Throwable e) {
textView.append(" First onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " First onError : " + e.getMessage());
}
@Override
public void onComplete() {
textView.append(" First onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " First onComplete");
}
};
@@ -97,11 +102,13 @@ private Observer getSecondObserver() {
public void onSubscribe(Disposable d) {
textView.append(" Second onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " Second onSubscribe : " + d.isDisposed());
+ textView.append(AppConstant.LINE_SEPARATOR);
}
@Override
public void onNext(Integer value) {
textView.append(" Second onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " Second onNext value : " + value);
}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java
new file mode 100644
index 0000000..34bb5e4
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java
@@ -0,0 +1,130 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.subjects.ReplaySubject;
+
+/**
+ * Created by amitshekhar on 17/12/16.
+ */
+
+public class ReplaySubjectExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ReplaySubjectExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* ReplaySubject emits to any observer all of the items that were emitted
+ * by the source Observable, regardless of when the observer subscribes.
+ */
+ private void doSomeWork() {
+
+ ReplaySubject source = ReplaySubject.create();
+
+ source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4
+
+ source.onNext(1);
+ source.onNext(2);
+ source.onNext(3);
+ source.onNext(4);
+ source.onComplete();
+
+ /*
+ * it will emit 1, 2, 3, 4 for second observer also as we have used replay
+ */
+ source.subscribe(getSecondObserver());
+
+ }
+
+
+ private Observer getFirstObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " First onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" First onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" First onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" First onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " First onComplete");
+ }
+ };
+ }
+
+ private Observer getSecondObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ textView.append(" Second onSubscribe : isDisposed :" + d.isDisposed());
+ Log.d(TAG, " Second onSubscribe : " + d.isDisposed());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" Second onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onNext value : " + value);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" Second onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onError : " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" Second onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " Second onComplete");
+ }
+ };
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java
new file mode 100644
index 0000000..0c263c2
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java
@@ -0,0 +1,93 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.BiFunction;
+import io.reactivex.schedulers.Schedulers;
+
+public class ScanExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ScanExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* Using scan operator, it sends also the previous result */
+ private void doSomeWork() {
+ getObservable()
+ // Run on a background thread
+ .subscribeOn(Schedulers.io())
+ // Be notified on the main thread
+ .observeOn(AndroidSchedulers.mainThread())
+ .scan(new BiFunction() {
+ @Override
+ public Integer apply(Integer int1, Integer int2) {
+ return int1 + int2;
+ }
+ })
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.just(1, 2, 3, 4, 5);
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
+
+ @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/SimpleExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
similarity index 83%
rename from app/src/main/java/com/rxjava2/android/samples/SimpleExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
index 2acca78..6329b1b 100644
--- a/app/src/main/java/com/rxjava2/android/samples/SimpleExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -26,8 +29,8 @@ public class SimpleExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -58,25 +61,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(String value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/SingleObserverExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
similarity index 81%
rename from app/src/main/java/com/rxjava2/android/samples/SingleObserverExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
index edb91fa..403f070 100644
--- a/app/src/main/java/com/rxjava2/android/samples/SingleObserverExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
@@ -24,8 +27,8 @@ public class SingleObserverExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -47,19 +50,20 @@ private SingleObserver getSingleObserver() {
return new SingleObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onSuccess(String value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext value : " + value);
}
@Override
public void onError(Throwable e) {
textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onError : " + e.getMessage());
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/SkipExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
similarity index 81%
rename from app/src/main/java/com/rxjava2/android/samples/SkipExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
index 9a9463c..06ad8eb 100644
--- a/app/src/main/java/com/rxjava2/android/samples/SkipExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -26,8 +29,8 @@ public class SkipExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -37,7 +40,7 @@ public void onClick(View view) {
});
}
- /* Using skip operator, it only not emit
+ /* Using skip operator, it will not emit
* the first 2 values.
*/
private void doSomeWork() {
@@ -59,25 +62,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(Integer value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java
new file mode 100644
index 0000000..d787bc5
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java
@@ -0,0 +1,105 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Function;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by thanhtuan on 26/04/18.
+ */
+public class SwitchMapExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = SwitchMapExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* whenever a new item is emitted by the source Observable, it will unsubscribe to and stop
+ * mirroring the Observable that was generated from the previously-emitted item,
+ * and begin only mirroring the current one.
+ *
+ * Result: 5x
+ */
+ private void doSomeWork() {
+ getObservable()
+ .switchMap(new Function>() {
+ @Override
+ public ObservableSource apply(Integer integer) {
+ int delay = new Random().nextInt(2);
+
+ return Observable.just(integer.toString() + "x")
+ .delay(delay, TimeUnit.SECONDS, Schedulers.io());
+ }
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.just(1, 2, 3, 4, 5);
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
+
+ @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");
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/TakeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
similarity index 83%
rename from app/src/main/java/com/rxjava2/android/samples/TakeExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
index 290d651..74b4b9f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/TakeExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
@@ -1,12 +1,15 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -26,8 +29,8 @@ public class TakeExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -59,25 +62,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(Integer value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeOperatorBaseActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeOperatorBaseActivity.java
new file mode 100644
index 0000000..a078b5b
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeOperatorBaseActivity.java
@@ -0,0 +1,71 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.rxjava2.android.samples.R;
+import com.rxjava2.android.samples.utils.AppConstant;
+import com.rxjava2.android.samples.utils.ObserverAdapter;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
+
+public abstract class TakeOperatorBaseActivity extends AppCompatActivity {
+ private static final String TAG = TakeWhileExampleActivity.class.getSimpleName();
+
+ private Button btn;
+
+ protected TextView textView;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(view -> {
+ doSomeWork();
+ });
+ }
+
+ /**
+ * Need to be override based on the operation.
+ */
+ abstract void doSomeWork();
+
+ protected Observer super String> getObserver() {
+ return new ObserverAdapter() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
+
+ @Override
+ public void onComplete() {
+ textView.append(" onComplete");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onComplete");
+ }
+ };
+ }
+
+
+ protected Observable getStringObservable() {
+ return Observable.just("Alpha", "Beta", "Cupcake", "Doughnut", "Eclair", "Froyo", "GingerBread",
+ "Honeycomb", "Ice cream sandwich");
+ }
+
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeUntilExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeUntilExampleActivity.java
new file mode 100644
index 0000000..e0313d0
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeUntilExampleActivity.java
@@ -0,0 +1,45 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.util.Log;
+
+import com.rxjava2.android.samples.utils.AppConstant;
+import com.rxjava2.android.samples.utils.ObserverAdapter;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.BiFunction;
+
+public class TakeUntilExampleActivity extends TakeOperatorBaseActivity {
+
+ private static final String TAG = TakeWhileExampleActivity.class.getSimpleName();
+
+ @Override
+ protected void doSomeWork() {
+ Observable timerObservable = Observable.timer(5, TimeUnit.SECONDS);
+ timerObservable.subscribe(new ObserverAdapter() {
+ @Override
+ public void onComplete() {
+ String print = " Timer completed";
+ textView.append(print);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, print);
+ }
+ });
+
+ getStringObservable()
+ //Delay item emission by one second
+ .zipWith(Observable.interval(0, 1, TimeUnit.SECONDS), new BiFunction() {
+ @Override
+ public String apply(String s, Long aLong) throws Exception {
+ return s;
+ }
+ })
+ //Will receive the items from Strings observable until timerObservable doesn't start emitting data.
+ .takeUntil(timerObservable)
+ //We need to observe on MainThread because delay works on background thread to avoid UI blocking.
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeWhileExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeWhileExampleActivity.java
new file mode 100644
index 0000000..213b779
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeWhileExampleActivity.java
@@ -0,0 +1,35 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.BiFunction;
+import io.reactivex.functions.Predicate;
+
+public class TakeWhileExampleActivity extends TakeOperatorBaseActivity {
+
+ private static final String TAG = TakeWhileExampleActivity.class.getSimpleName();
+
+ @Override
+ protected void doSomeWork() {
+ getStringObservable()
+ //Delay item emission by one second
+ .zipWith(Observable.interval(0, 1, TimeUnit.SECONDS), new BiFunction() {
+ @Override
+ public String apply(String s, Long aLong) throws Exception {
+ return s;
+ }
+ })
+ //Take the items until the condition is met.
+ .takeWhile(new Predicate() {
+ @Override
+ public boolean test(String s) throws Exception {
+ return !s.toLowerCase().contains("honey");
+ }
+ })
+ //We need to observe on MainThread because delay works on background thread to avoid UI blocking.
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleFirstExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleFirstExampleActivity.java
new file mode 100644
index 0000000..a009cc1
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleFirstExampleActivity.java
@@ -0,0 +1,121 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.concurrent.TimeUnit;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+
+/**
+ * Created by threshold on 2017/1/11.
+ */
+
+public class ThrottleFirstExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ThrottleFirstExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * Using throttleFirst() -> if the source Observable has emitted no items since
+ * the last time it was sampled, the Observable that results from this operator
+ * will emit no item for that sampling period.
+ */
+ private void doSomeWork() {
+ getObservable()
+ .throttleFirst(500, TimeUnit.MILLISECONDS)
+ // Run on a background thread
+ .subscribeOn(Schedulers.io())
+ // Be notified on the main thread
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.create(new ObservableOnSubscribe() {
+ @Override
+ public void subscribe(ObservableEmitter emitter) throws Exception {
+ // send events with simulated time wait
+ Thread.sleep(0);
+ emitter.onNext(1); // deliver
+ emitter.onNext(2); // skip
+ Thread.sleep(505);
+ emitter.onNext(3); // deliver
+ Thread.sleep(99);
+ emitter.onNext(4); // skip
+ Thread.sleep(100);
+ emitter.onNext(5); // skip
+ emitter.onNext(6); // skip
+ Thread.sleep(305);
+ emitter.onNext(7); // deliver
+ Thread.sleep(510);
+ emitter.onComplete();
+ }
+ });
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : ");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ textView.append(" value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext ");
+ Log.d(TAG, " value : " + value);
+ }
+
+ @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/operators/ThrottleLastExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java
new file mode 100644
index 0000000..b48e208
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java
@@ -0,0 +1,120 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.concurrent.TimeUnit;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by amitshekhar on 22/12/16.
+ */
+
+public class ThrottleLastExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ThrottleLastExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * Using throttleLast() -> emit the most recent items emitted by an Observable within
+ * periodic time intervals, so here it will emit 2, 6 and 7 as we have simulated it to be the
+ * last the element in the interval of 500 millis
+ */
+ private void doSomeWork() {
+ getObservable()
+ .throttleLast(500, TimeUnit.MILLISECONDS)
+ // Run on a background thread
+ .subscribeOn(Schedulers.io())
+ // Be notified on the main thread
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getObserver());
+ }
+
+ private Observable getObservable() {
+ return Observable.create(new ObservableOnSubscribe() {
+ @Override
+ public void subscribe(ObservableEmitter emitter) throws Exception {
+ // send events with simulated time wait
+ Thread.sleep(0);
+ emitter.onNext(1); // skip
+ emitter.onNext(2); // deliver
+ Thread.sleep(505);
+ emitter.onNext(3); // skip
+ Thread.sleep(99);
+ emitter.onNext(4); // skip
+ Thread.sleep(100);
+ emitter.onNext(5); // skip
+ emitter.onNext(6); // deliver
+ Thread.sleep(305);
+ emitter.onNext(7); // deliver
+ Thread.sleep(510);
+ emitter.onComplete();
+ }
+ });
+ }
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : ");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ textView.append(" value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext ");
+ Log.d(TAG, " value : " + value);
+ }
+
+ @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/TimerExample.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
similarity index 78%
rename from app/src/main/java/com/rxjava2/android/samples/TimerExample.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
index 507db3b..cbfa1e1 100644
--- a/app/src/main/java/com/rxjava2/android/samples/TimerExample.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
@@ -1,14 +1,17 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.utils.AppConstant;
+
import java.util.concurrent.TimeUnit;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -18,9 +21,9 @@
/**
* Created by amitshekhar on 27/08/16.
*/
-public class TimerExample extends AppCompatActivity {
+public class TimerExampleActivity extends AppCompatActivity {
- private static final String TAG = TimerExample.class.getSimpleName();
+ private static final String TAG = TimerExampleActivity.class.getSimpleName();
Button btn;
TextView textView;
@@ -28,8 +31,8 @@ public class TimerExample extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -60,25 +63,27 @@ private Observer getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(Long value) {
textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
Log.d(TAG, " onNext : value : " + value);
}
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java
new file mode 100644
index 0000000..881db12
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java
@@ -0,0 +1,77 @@
+package com.rxjava2.android.samples.ui.operators;
+
+import android.os.Bundle;
+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.utils.AppConstant;
+
+import java.util.concurrent.TimeUnit;
+
+import androidx.appcompat.app.AppCompatActivity;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.Consumer;
+import io.reactivex.schedulers.Schedulers;
+
+public class WindowExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = WindowExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_example);
+ btn = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
+
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /*
+ * Example using window operator -> It periodically
+ * subdivide items from an Observable into
+ * Observable windows and emit these windows rather than
+ * emitting the items one at a time
+ */
+ protected void doSomeWork() {
+
+ Observable.interval(1, TimeUnit.SECONDS).take(12)
+ .window(3, TimeUnit.SECONDS)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getConsumer());
+ }
+
+ public Consumer> getConsumer() {
+ return new Consumer>() {
+ @Override
+ public void accept(Observable observable) {
+ Log.d(TAG, "Sub Divide begin....");
+ textView.append("Sub Divide begin ....");
+ textView.append(AppConstant.LINE_SEPARATOR);
+ observable
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Consumer() {
+ @Override
+ public void accept(Long value) {
+ Log.d(TAG, "Next:" + value);
+ textView.append("Next:" + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ }
+ });
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ZipExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java
similarity index 77%
rename from app/src/main/java/com/rxjava2/android/samples/ZipExampleActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java
index d51c88c..11cb394 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ZipExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java
@@ -1,17 +1,19 @@
-package com.rxjava2.android.samples;
+package com.rxjava2.android.samples.ui.operators;
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.model.User;
+import com.rxjava2.android.samples.utils.AppConstant;
import com.rxjava2.android.samples.utils.Utils;
import java.util.List;
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
@@ -34,8 +36,8 @@ public class ZipExampleActivity extends AppCompatActivity {
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 = findViewById(R.id.btn);
+ textView = findViewById(R.id.textView);
btn.setOnClickListener(new View.OnClickListener() {
@Override
@@ -46,16 +48,16 @@ public void onClick(View view) {
}
/*
- * Here we are getting two user list
- * One, the list of cricket fans
- * Another one, the list of football fans
- * Then we are finding the list of users who loves both
- */
+ * Here we are getting two user list
+ * One, the list of cricket fans
+ * Another one, the list of football fans
+ * Then we are finding the list of users who loves both
+ */
private void doSomeWork() {
Observable.zip(getCricketFansObservable(), getFootballFansObservable(),
new BiFunction, List, List>() {
@Override
- public List apply(List cricketFans, List footballFans) throws Exception {
+ public List apply(List cricketFans, List footballFans) {
return Utils.filterUserWhoLovesBoth(cricketFans, footballFans);
}
})
@@ -69,25 +71,25 @@ public List apply(List cricketFans, List footballFans) throws
private Observable> getCricketFansObservable() {
return Observable.create(new ObservableOnSubscribe>() {
@Override
- public void subscribe(ObservableEmitter> e) throws Exception {
- if (!e.isCancelled()) {
+ public void subscribe(ObservableEmitter> e) {
+ if (!e.isDisposed()) {
e.onNext(Utils.getUserListWhoLovesCricket());
e.onComplete();
}
}
- });
+ }).subscribeOn(Schedulers.io());
}
private Observable> getFootballFansObservable() {
return Observable.create(new ObservableOnSubscribe>() {
@Override
- public void subscribe(ObservableEmitter> e) throws Exception {
- if (!e.isCancelled()) {
+ public void subscribe(ObservableEmitter> e) {
+ if (!e.isDisposed()) {
e.onNext(Utils.getUserListWhoLovesFootball());
e.onComplete();
}
}
- });
+ }).subscribeOn(Schedulers.io());
}
private Observer> getObserver() {
@@ -95,15 +97,16 @@ private Observer> getObserver() {
@Override
public void onSubscribe(Disposable d) {
- textView.append(" onSubscribe : isDisposed :" + d.isDisposed());
Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
@Override
public void onNext(List userList) {
textView.append(" onNext");
+ textView.append(AppConstant.LINE_SEPARATOR);
for (User user : userList) {
- textView.append(" firstName : " + user.firstName);
+ textView.append(" firstname : " + user.firstname);
+ textView.append(AppConstant.LINE_SEPARATOR);
}
Log.d(TAG, " onNext : " + userList.size());
}
@@ -111,12 +114,14 @@ public void onNext(List userList) {
@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");
}
};
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java
new file mode 100644
index 0000000..e9c89a9
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java
@@ -0,0 +1,133 @@
+package com.rxjava2.android.samples.ui.pagination;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.rxjava2.android.samples.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Single;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.processors.PublishProcessor;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by amitshekhar on 15/03/17.
+ */
+
+public class PaginationActivity extends AppCompatActivity {
+
+ public static final String TAG = PaginationActivity.class.getSimpleName();
+ private CompositeDisposable compositeDisposable = new CompositeDisposable();
+ private PublishProcessor paginator = PublishProcessor.create();
+ private PaginationAdapter paginationAdapter;
+ private RecyclerView recyclerView;
+ private ProgressBar progressBar;
+ private boolean loading = false;
+ private int pageNumber = 1;
+ private final int VISIBLE_THRESHOLD = 1;
+ private int lastVisibleItem, totalItemCount;
+ private LinearLayoutManager layoutManager;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_pagination);
+ recyclerView = findViewById(R.id.recyclerView);
+ progressBar = findViewById(R.id.progressBar);
+ layoutManager = new LinearLayoutManager(this);
+ layoutManager.setOrientation(RecyclerView.VERTICAL);
+ recyclerView.setLayoutManager(layoutManager);
+ paginationAdapter = new PaginationAdapter();
+ recyclerView.setAdapter(paginationAdapter);
+ setUpLoadMoreListener();
+ subscribeForData();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ compositeDisposable.clear();
+ }
+
+ /**
+ * setting listener to get callback for load more
+ */
+ private void setUpLoadMoreListener() {
+ recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+ @Override
+ public void onScrolled(RecyclerView recyclerView,
+ int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+
+ totalItemCount = layoutManager.getItemCount();
+ lastVisibleItem = layoutManager
+ .findLastVisibleItemPosition();
+ if (!loading
+ && totalItemCount <= (lastVisibleItem + VISIBLE_THRESHOLD)) {
+ pageNumber++;
+ paginator.onNext(pageNumber);
+ loading = true;
+ }
+ }
+ });
+ }
+
+ /**
+ * subscribing for data
+ */
+ private void subscribeForData() {
+
+ Disposable disposable = paginator
+ .onBackpressureDrop()
+ .doOnNext(page -> {
+ loading = true;
+ progressBar.setVisibility(View.VISIBLE);
+ })
+ .concatMapSingle(page -> dataFromNetwork(page)
+ .subscribeOn(Schedulers.io())
+ .doOnError(throwable -> {
+ // handle error
+ })
+ // continue emission in case of error also
+ .onErrorReturn(throwable -> new ArrayList<>()))
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(items -> {
+ paginationAdapter.addItems(items);
+ paginationAdapter.notifyDataSetChanged();
+ loading = false;
+ progressBar.setVisibility(View.INVISIBLE);
+ });
+
+ compositeDisposable.add(disposable);
+
+ paginator.onNext(pageNumber);
+
+ }
+
+ /**
+ * Simulation of network data
+ */
+ private Single> dataFromNetwork(final int page) {
+ return Single.just(true)
+ .delay(2, TimeUnit.SECONDS)
+ .map(value -> {
+ List items = new ArrayList<>();
+ for (int i = 1; i <= 10; i++) {
+ items.add("Item " + (page * 10 + i));
+ }
+ return items;
+ });
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java
new file mode 100644
index 0000000..ddc0402
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java
@@ -0,0 +1,60 @@
+package com.rxjava2.android.samples.ui.pagination;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.rxjava2.android.samples.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Created by amitshekhar on 15/03/17.
+ */
+
+public class PaginationAdapter extends RecyclerView.Adapter {
+
+ List items = new ArrayList<>();
+
+ public PaginationAdapter() {
+
+ }
+
+ void addItems(List items) {
+ this.items.addAll(items);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return ItemViewHolder.create(parent);
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ ((ItemViewHolder) holder).bind(items.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return items.size();
+ }
+
+ private static class ItemViewHolder extends RecyclerView.ViewHolder {
+ ItemViewHolder(View itemView) {
+ super(itemView);
+ }
+
+ static ItemViewHolder create(ViewGroup parent) {
+ return new ItemViewHolder(
+ LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pagination, parent, false));
+ }
+
+ void bind(String content) {
+ ((TextView) itemView).setText(content);
+ }
+ }
+}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/rxbus/RxBus.java b/app/src/main/java/com/rxjava2/android/samples/ui/rxbus/RxBus.java
new file mode 100644
index 0000000..cdc81b0
--- /dev/null
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/rxbus/RxBus.java
@@ -0,0 +1,28 @@
+package com.rxjava2.android.samples.ui.rxbus;
+
+import io.reactivex.Observable;
+import io.reactivex.subjects.PublishSubject;
+
+/**
+ * Created by amitshekhar on 06/02/17.
+ */
+
+public class RxBus {
+
+ public RxBus() {
+ }
+
+ private PublishSubject