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 114898d..8aa4e01 100644
--- a/README.md
+++ b/README.md
@@ -1,117 +1,112 @@
+
+
# Learning RxJava 2 for Android by example
-## How to use RxJava 2 in Android Application
-## How to migrate from RxJava 1 to RxJava 2
### 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.
+
+### Follow Amit Shekhar
+
+- [X/Twitter](https://twitter.com/amitiitbhu)
+- [LinkedIn](https://www.linkedin.com/in/amit-shekhar-iitbhu)
+- [GitHub](https://github.com/amitshekhariitbhu)
+
+### Follow Outcome School
-Because Reactive-Streams has a different architecture, it mandates changes to some well known RxJava types.
+- [YouTube](https://youtube.com/@OutcomeSchool)
+- [X/Twitter](https://x.com/outcome_school)
+- [LinkedIn](https://www.linkedin.com/company/outcomeschool)
+- [GitHub](http://github.com/OutcomeSchool)
+## I teach at Outcome School
-# Migration From RxJava 1 to RxJava 2
+- AI and Machine Learning
+- Android
-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.
+Join Outcome School and get a high-paying tech job: [Outcome School](https://outcomeschool.com)
-Users switching from 1.x to 2.x have to re-organize their imports, but carefully.
+### 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.4'
+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.1'
+compile 'io.reactivex.rxjava2:rxandroid:X.X.X'
```
-# RxJava 2 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 Example using `SingleObserver`, `CompletableObserver`.
+# RxJava 2 Operators Examples present in this sample project:
-* 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/operators/DisposableExampleActivity.java) - Using `CompositeDisposable`
-* [FlowableExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/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/operators/SingleObserverExampleActivity.java) - Using `SingleObserver`
-* [CompletableObserverActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/CompletableObserverExampleActivity.java) - Using `CompletableObserver`
-* [MapExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/MapExampleActivity.java) - Using `map` Operator
-* [ZipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/ZipExampleActivity.java) - Using `zip` Operator
-* [BufferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/BufferExampleActivity.java) - Using `buffer` Operator
-* [TakeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/TakeExampleActivity.java) - Using `take` Operator
-* [ReduceExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/ReduceExampleActivity.java) - Using `reduce` Operator
-* [FilterExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/FilterExampleActivity.java) - Using `filter` Operator
-* [SkipExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/SkipExampleActivity.java) - Using `skip` Operator
-* [ReplayExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/ReplayExampleActivity.java) - Using `replay` Operator
-* [ConcatExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/ConcatExampleActivity.java) - Using `concat` Operator
-* [MergeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/MergeExampleActivity.java) - Using `merge` Operator
-* [DeferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/DeferExampleActivity.java) - Using `defer` Observable
-* [IntervalExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/operators/IntervalExampleActivity.java) - Using `Interval`
-
-### TODO
-
-* Many examples are to be added
+* [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:
-### Check out an awesome library for fast and simple networking in Android.
-* [Fast Android Networking Library](https://github.com/amitshekhariitbhu/Fast-Android-Networking)
+Thanks
+
+**Amit Shekhar**\
+Co-Founder @ [Outcome School](https://outcomeschool.com)
+
+You can connect with me on:
-### Contact - Let's become friend
- [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.
@@ -128,5 +123,4 @@ RxJava1 -> RxJava2
### 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 c3c8d89..fe13a5b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 28
+ buildToolsVersion "28.0.2"
defaultConfig {
applicationId "com.rxjava2.android.samples"
minSdkVersion 16
- targetSdkVersion 25
+ targetSdkVersion 28
versionCode 1
versionName "1.0"
}
@@ -17,14 +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:25.1.0'
- compile 'io.reactivex.rxjava2:rxjava:2.0.4'
- compile('io.reactivex.rxjava2:rxandroid:2.0.1'){
- exclude group: 'io.reactivex.rxjava2', module: 'rxjava'
- }
+ 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 1542126..720343a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,6 +1,8 @@
+ package="com.rxjava2.android.samples">
+
+
-
+
-
+
-
+
+
+
+
+
+
+
+ android:label="@string/simple" />
+ android:label="@string/map" />
+ android:label="@string/zip" />
+ android:label="@string/disposable" />
+ android:label="@string/take" />
+ android:label="@string/timer" />
+ android:label="@string/interval" />
+ android:label="@string/SingleObserver" />
+ android:label="@string/CompletableObserver" />
+ android:label="@string/Flowable" />
+ android:label="@string/reduce" />
+ android:label="@string/buffer" />
+ android:label="@string/filter" />
+ android:label="@string/skip" />
+ android:label="@string/scan" />
+ android:label="@string/replay" />
+ android:label="@string/concat" />
+ android:label="@string/merge" />
+ android:label="@string/defer" />
+ android:label="@string/distinct" />
+ android:label="@string/last" />
+ android:label="@string/replay_subject" />
+ android:label="@string/publish_subject" />
+ android:label="@string/behavior_subject" />
+ android:label="@string/async_subject" />
+ android:label="@string/throttle_last" />
-
-
+ android:label="@string/debounce" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/MyApplication.java b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java
index b5c7649..781cb30 100644
--- a/app/src/main/java/com/rxjava2/android/samples/MyApplication.java
+++ b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java
@@ -2,17 +2,41 @@
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.class.getSimpleName();
+ 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 941bfc3..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,15 +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 + '\'' +
+ ", 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
index 90f86ee..a5ecffa 100644
--- a/app/src/main/java/com/rxjava2/android/samples/model/Car.java
+++ b/app/src/main/java/com/rxjava2/android/samples/model/Car.java
@@ -17,10 +17,9 @@ public void setBrand(String brand) {
}
public Observable brandDeferObservable() {
-// return Observable.just(brand);
return Observable.defer(new Callable>() {
@Override
- public ObservableSource extends String> call() throws Exception {
+ 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 5d64ffb..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,15 +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 + '\'' +
+ ", 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/ExampleBaseActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/ExampleBaseActivity.java
deleted file mode 100644
index e894963..0000000
--- a/app/src/main/java/com/rxjava2/android/samples/ui/ExampleBaseActivity.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package com.rxjava2.android.samples.ui;
-
-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 io.reactivex.CompletableObserver;
-import io.reactivex.MaybeObserver;
-import io.reactivex.Observer;
-import io.reactivex.SingleObserver;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.observers.DisposableObserver;
-
-/**
- * Created by threshold on 2017/1/11.
- */
-
-public abstract class ExampleBaseActivity extends AppCompatActivity {
-
- protected String TAG = getClass().getSimpleName();
- protected Button btn;
- protected TextView textView;
-
- @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();
- }
- });
- }
-
- /**
- * Do some work on button click.
- */
- protected abstract void doSomeWork();
-
- protected Observer getObserver() {
- return getObserver("");
- }
-
- protected Observer getObserver(final Object observerTag) {
- return new Observer() {
-
- @Override
- public void onSubscribe(Disposable d) {
- ExampleBaseActivity.this.onSubscribe(observerTag, d);
- }
-
- @Override
- public void onNext(T value) {
- ExampleBaseActivity.this.onNext(observerTag, value);
- }
-
- @Override
- public void onError(Throwable e) {
- ExampleBaseActivity.this.onError(observerTag, e);
- }
-
- @Override
- public void onComplete() {
- ExampleBaseActivity.this.onComplete(observerTag);
- }
- };
- }
-
- protected CompletableObserver getCompletableObserver() {
- return getCompletableObserver("");
- }
-
- protected CompletableObserver getCompletableObserver(final Object observerTag) {
- return new CompletableObserver() {
- @Override
- public void onSubscribe(Disposable d) {
- ExampleBaseActivity.this.onSubscribe(observerTag, d);
- }
-
- @Override
- public void onComplete() {
- ExampleBaseActivity.this.onComplete(observerTag);
- }
-
- @Override
- public void onError(Throwable e) {
- ExampleBaseActivity.this.onError(observerTag, e);
- }
- };
- }
-
- protected DisposableObserver getDisposableObserver() {
- return getDisposableObserver("");
- }
-
- protected DisposableObserver getDisposableObserver(final Object observerTag) {
- return new DisposableObserver() {
- @Override
- public void onNext(T t) {
- ExampleBaseActivity.this.onNext(observerTag, t);
- }
-
- @Override
- public void onError(Throwable e) {
- ExampleBaseActivity.this.onError(observerTag, e);
- }
-
- @Override
- public void onComplete() {
- ExampleBaseActivity.this.onComplete(observerTag);
- }
- };
- }
-
- protected SingleObserver getSingleObserver() {
- return getSingleObserver("");
- }
-
- protected SingleObserver getSingleObserver(final Object observerTag) {
- return new SingleObserver() {
- @Override
- public void onSubscribe(Disposable d) {
- ExampleBaseActivity.this.onSubscribe(observerTag, d);
- }
-
- @Override
- public void onSuccess(T t) {
- ExampleBaseActivity.this.onNext(observerTag, t);
- }
-
- @Override
- public void onError(Throwable e) {
- ExampleBaseActivity.this.onError(observerTag, e);
- }
- };
- }
-
- protected MaybeObserver getMaybeObserver() {
- return getMaybeObserver("");
- }
-
- protected MaybeObserver getMaybeObserver(final Object observerTag) {
- return new MaybeObserver() {
- @Override
- public void onSubscribe(Disposable d) {
- ExampleBaseActivity.this.onSubscribe(observerTag, d);
- }
-
- @Override
- public void onSuccess(T t) {
- ExampleBaseActivity.this.onSuccess(observerTag, t);
- }
-
- @Override
- public void onError(Throwable e) {
- ExampleBaseActivity.this.onError(observerTag, e);
- }
-
- @Override
- public void onComplete() {
- ExampleBaseActivity.this.onComplete(observerTag);
- }
- };
- }
-
- protected void onSubscribe(Object observerTag, Disposable d) {
- String msg = observerTag + " onSubscribe";
- if (d != null) {
- msg = msg + ": isDisposed :" + d.isDisposed();
- }
- Log.d(TAG, msg);
- textView.append(msg);
- textView.append(AppConstant.LINE_SEPARATOR);
- }
-
- protected void onNext(Object observerTag, T value) {
- onPositive(observerTag, "onNext", value);
- }
-
- protected void onSuccess(Object observerTag, T value) {
- onPositive(observerTag, "onSuccess", value);
- }
-
- private void onPositive(Object observerTag, String positiveKey, T value) {
- if (value instanceof List) {
- List valueList = (List) value;
- Log.d(TAG, observerTag + " " + positiveKey + " size :" + valueList.size());
- textView.append(observerTag + " " + positiveKey + " size :" + valueList.size());
- textView.append(AppConstant.LINE_SEPARATOR);
- for (Object obj : valueList) {
- Log.d(TAG, " : value : " + obj.toString());
- textView.append(" value : " + obj.toString());
- textView.append(AppConstant.LINE_SEPARATOR);
- }
- } else {
- Log.d(TAG, observerTag + " " + positiveKey + " value : " + value);
- textView.append(observerTag + " " + positiveKey + " : value : " + value);
- textView.append(AppConstant.LINE_SEPARATOR);
- }
- }
-
- protected void onError(Object observerTag, Throwable e) {
- textView.append(observerTag + " onError : " + e.getMessage());
- textView.append(AppConstant.LINE_SEPARATOR);
- Log.e(TAG, observerTag + " onError : ", e);
- }
-
- public void onComplete(Object observerTag) {
- textView.append(observerTag + " onComplete");
- textView.append(AppConstant.LINE_SEPARATOR);
- Log.d(TAG, observerTag + " onComplete");
- }
-
-
-}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/MainActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java
similarity index 54%
rename from app/src/main/java/com/rxjava2/android/samples/ui/MainActivity.java
rename to app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java
index 00f7352..3986c9a 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/MainActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java
@@ -2,7 +2,6 @@
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.rxjava2.android.samples.R;
@@ -13,6 +12,7 @@
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;
@@ -29,136 +29,155 @@
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;
-public class MainActivity extends AppCompatActivity {
+import androidx.appcompat.app.AppCompatActivity;
+
+public class OperatorsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
+ setContentView(R.layout.activity_operators);
}
public void startSimpleActivity(View view) {
- startActivity(new Intent(MainActivity.this, SimpleExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, SimpleExampleActivity.class));
}
public void startMapActivity(View view) {
- startActivity(new Intent(MainActivity.this, MapExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, MapExampleActivity.class));
}
public void startZipActivity(View view) {
- startActivity(new Intent(MainActivity.this, ZipExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ZipExampleActivity.class));
}
public void startDisposableActivity(View view) {
- startActivity(new Intent(MainActivity.this, DisposableExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, DisposableExampleActivity.class));
}
public void startTakeActivity(View view) {
- startActivity(new Intent(MainActivity.this, TakeExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, TakeExampleActivity.class));
}
public void startTimerActivity(View view) {
- startActivity(new Intent(MainActivity.this, TimerExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, TimerExampleActivity.class));
}
public void startIntervalActivity(View view) {
- startActivity(new Intent(MainActivity.this, IntervalExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, IntervalExampleActivity.class));
}
public void startSingleObserverActivity(View view) {
- startActivity(new Intent(MainActivity.this, SingleObserverExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, SingleObserverExampleActivity.class));
}
public void startCompletableObserverActivity(View view) {
- startActivity(new Intent(MainActivity.this, CompletableObserverExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, CompletableObserverExampleActivity.class));
}
public void startFlowableActivity(View view) {
- startActivity(new Intent(MainActivity.this, FlowableExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, FlowableExampleActivity.class));
}
public void startReduceActivity(View view) {
- startActivity(new Intent(MainActivity.this, ReduceExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ReduceExampleActivity.class));
}
public void startBufferActivity(View view) {
- startActivity(new Intent(MainActivity.this, BufferExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, BufferExampleActivity.class));
}
public void startFilterActivity(View view) {
- startActivity(new Intent(MainActivity.this, FilterExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, FilterExampleActivity.class));
}
public void startSkipActivity(View view) {
- startActivity(new Intent(MainActivity.this, SkipExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, SkipExampleActivity.class));
}
public void startScanActivity(View view) {
- startActivity(new Intent(MainActivity.this, ScanExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ScanExampleActivity.class));
}
public void startReplayActivity(View view) {
- startActivity(new Intent(MainActivity.this, ReplayExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ReplayExampleActivity.class));
}
public void startConcatActivity(View view) {
- startActivity(new Intent(MainActivity.this, ConcatExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ConcatExampleActivity.class));
}
public void startMergeActivity(View view) {
- startActivity(new Intent(MainActivity.this, MergeExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, MergeExampleActivity.class));
}
public void startDeferActivity(View view) {
- startActivity(new Intent(MainActivity.this, DeferExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, DeferExampleActivity.class));
}
public void startDistinctActivity(View view) {
- startActivity(new Intent(MainActivity.this, DistinctExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, DistinctExampleActivity.class));
}
public void startLastOperatorActivity(View view) {
- startActivity(new Intent(MainActivity.this, LastOperatorExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, LastOperatorExampleActivity.class));
}
public void startReplaySubjectActivity(View view) {
- startActivity(new Intent(MainActivity.this, ReplaySubjectExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ReplaySubjectExampleActivity.class));
}
public void startPublishSubjectActivity(View view) {
- startActivity(new Intent(MainActivity.this, PublishSubjectExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, PublishSubjectExampleActivity.class));
}
public void startBehaviorSubjectActivity(View view) {
- startActivity(new Intent(MainActivity.this, BehaviorSubjectExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, BehaviorSubjectExampleActivity.class));
}
public void startAsyncSubjectActivity(View view) {
- startActivity(new Intent(MainActivity.this, AsyncSubjectExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, AsyncSubjectExampleActivity.class));
}
public void startThrottleFirstActivity(View view) {
- startActivity(new Intent(MainActivity.this,ThrottleFirstExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this,ThrottleFirstExampleActivity.class));
}
public void startThrottleLastActivity(View view) {
- startActivity(new Intent(MainActivity.this, ThrottleLastExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, ThrottleLastExampleActivity.class));
}
public void startDebounceActivity(View view) {
- startActivity(new Intent(MainActivity.this, DebounceExampleActivity.class));
+ startActivity(new Intent(OperatorsActivity.this, DebounceExampleActivity.class));
}
public void startWindowActivity(View view) {
- startActivity(new Intent(MainActivity.this,WindowExampleActivity.class));
+ 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
index 3626c7d..d2243a2 100644
--- 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
@@ -1,41 +1,131 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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.)
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
+
AsyncSubject source = AsyncSubject.create();
- source.onNext(0);
- source.subscribe(getObserver("First")); // it will emit only 4 and onComplete
+ source.subscribe(getFirstObserver()); // it will emit only 4 and onComplete
source.onNext(1);
source.onNext(2);
source.onNext(3);
/*
- * it will also emit 4 and onComplete for second observer also.
+ * it will emit 4 and onComplete for second observer also.
*/
- source.subscribe(getObserver("Second"));
+ source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
- /*
- * it will also emit 4 and onComplete for second observer also.
- */
- source.subscribe(getObserver("Third"));
+ }
+
+
+ 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");
+ }
+ };
}
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
index cac0bd8..9eeadd0 100644
--- 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
@@ -1,24 +1,55 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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.
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
- BehaviorSubject source = BehaviorSubject.createDefault(-1);
+ BehaviorSubject source = BehaviorSubject.create();
- source.subscribe(getObserver("First")); // it will get -1, 1, 2, 3, 4 and onComplete
+ source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4 and onComplete
source.onNext(1);
source.onNext(2);
@@ -27,13 +58,76 @@ protected void doSomeWork() {
/*
* it will emit 3(last emitted), 4 and onComplete for second observer also.
*/
- source.subscribe(getObserver("Second"));
+ source.subscribe(getSecondObserver());
source.onNext(4);
source.onComplete();
- source.subscribe(getObserver("Third"));
+ }
+
+
+ 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");
+ }
+ };
}
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
index f779842..9171136 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java
@@ -1,22 +1,54 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.List;
+
+import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
+import io.reactivex.Observer;
+import io.reactivex.disposables.Disposable;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class BufferExampleActivity extends ExampleBaseActivity {
+public class BufferExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = BufferExampleActivity.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 buffer operator - bundles all emitted values into a list
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
+ Observable> buffered = getObservable().buffer(3, 1);
- // count = 3 means, it takes max of three from its start index and create list
- // skip = 1 means, it jumps one step every time
+ // 3 means, it takes max of three from its start index and create list
+ // 1 means, it jumps one step every time
// so the it gives the following list
// 1 - one, two, three
// 2 - two, three, four
@@ -24,13 +56,49 @@ protected void doSomeWork() {
// 4 - four, five
// 5 - five
- getObservable().buffer(3, 1)
- .subscribe(getObserver());
-
+ buffered.subscribe(getObserver());
}
private Observable getObservable() {
return Observable.just("one", "two", "three", "four", "five");
}
+ private Observer> getObserver() {
+ return new Observer>() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ 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);
+ }
+
+ }
+
+ @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/CompletableObserverExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
index 3089d8e..4ee612f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java
@@ -1,39 +1,52 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
-import java.util.Random;
+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.CompletableEmitter;
-import io.reactivex.CompletableOnSubscribe;
+import io.reactivex.CompletableObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class CompletableObserverExampleActivity extends ExampleBaseActivity {
+public class CompletableObserverExampleActivity extends AppCompatActivity {
- /*
- * simple example using CompletableObserver
- * Completable does not consist of onNext()
- */
- protected void doSomeWork() {
+ private static final String TAG = CompletableObserverExampleActivity.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);
- Completable completable = Completable.create(new CompletableOnSubscribe() {
+ btn.setOnClickListener(new View.OnClickListener() {
@Override
- public void subscribe(CompletableEmitter e) throws Exception {
- if (!e.isDisposed()) {
- int randomInt = new Random().nextInt(10);
- if (randomInt % 2 == 0) {
- e.onComplete();
- } else {
- e.onError(new IllegalStateException("Can't complete because an error has occurred."));
- }
- }
+ public void onClick(View view) {
+ doSomeWork();
}
});
+ }
+
+ /*
+ * simple example using CompletableObserver
+ */
+ private void doSomeWork() {
+ Completable completable = Completable.timer(1000, TimeUnit.MILLISECONDS);
completable
.subscribeOn(Schedulers.io())
@@ -42,5 +55,27 @@ public void subscribe(CompletableEmitter e) throws Exception {
.subscribe(getCompletableObserver());
}
+ private CompletableObserver getCompletableObserver() {
+ return new CompletableObserver() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ 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());
+ }
+ };
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
index 2899ef5..8bb3e2b 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java
@@ -1,13 +1,42 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.disposables.Disposable;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class ConcatExampleActivity extends ExampleBaseActivity {
+public class ConcatExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ConcatExampleActivity.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 concat operator to combine Observable : concat maintain
@@ -15,9 +44,9 @@ public class ConcatExampleActivity extends ExampleBaseActivity {
* It will emit all the 7 values in order
* here - first "A1", "A2", "A3", "A4" and then "B1", "B2", "B3"
* first all from the first Observable and then
- * all from the second Observable, all in order
+ * all from the second Observable all in order
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
final String[] aStrings = {"A1", "A2", "A3", "A4"};
final String[] bStrings = {"B1", "B2", "B3"};
@@ -29,4 +58,36 @@ protected void doSomeWork() {
}
+ 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/DebounceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java
index 64c7306..7837381 100644
--- 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
@@ -1,29 +1,55 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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.
*/
- protected void doSomeWork() {
-
- //debounce 是发射所有 时间片段 交集 中最后一个元素。
- //这里的时间片段是指每次发射元素的当前时刻+超时时间形成的时间片段
+ private void doSomeWork() {
getObservable()
.debounce(500, TimeUnit.MILLISECONDS)
// Run on a background thread
@@ -49,20 +75,42 @@ public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext(5); // deliver
Thread.sleep(510);
emitter.onComplete();
-
- /*
- 分析如下:
- 1和2在400毫秒处有交集,所以1被扔掉。
- 2和3之间有500毫秒的间隔,没有交集,所以2被发射出去。
- 3在905毫秒出准备发射,但是紧接着4在1005毫秒处也要准备发射,所以3和4有交集,3被扔掉。
- 4和5之间有605毫秒的间隔,没有交集,所以4被发射出去。
- 5在接下来的500毫秒内没有和其他元素有交集,所以发射出去。
- (如还不明白,建议在纸上画出各个元素的时间片段)
- s*/
-
}
});
}
+ 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
index 2c86e4f..0e6249c 100644
--- 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
@@ -1,26 +1,54 @@
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.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
Car car = new Car();
Observable brandDeferObservable = car.brandDeferObservable();
- car.setBrand("BMW");
- // Even if we are setting the brand after creating Observable
+ 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.
@@ -28,5 +56,36 @@ protected void doSomeWork() {
.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/ui/operators/DisposableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
index 134d562..9e51b3c 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java
@@ -1,24 +1,50 @@
package com.rxjava2.android.samples.ui.operators;
+import android.os.Bundle;
import android.os.SystemClock;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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;
import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class DisposableExampleActivity extends ExampleBaseActivity {
+public class DisposableExampleActivity extends AppCompatActivity {
+ private static final String TAG = DisposableExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
private final CompositeDisposable disposables = new CompositeDisposable();
+ @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();
+ }
+ });
+ }
+
@Override
protected void onDestroy() {
super.onDestroy();
@@ -29,19 +55,40 @@ protected void onDestroy() {
* Example to understand how to use disposables.
* disposables is cleared in onDestroy of this activity.
*/
- protected void doSomeWork() {
+ void doSomeWork() {
disposables.add(sampleObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
- .subscribeWith(this.getDisposableObserver()));
+ .subscribeWith(new DisposableObserver() {
+ @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);
+ }
+ }));
}
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");
@@ -49,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
index 555685f..af2c0e3 100644
--- 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
@@ -1,20 +1,83 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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());
+ }
- protected void doSomeWork(){
- getObservable().distinct() .subscribe(getObserver());
- }
+ @Override
+ public void onNext(Integer value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
+ }
- private Observable getObservable() {
- return Observable.just(1, 2, 1, 1, 2, 3, 4 ,6, 4);
- }
+ @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/ui/operators/FilterExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
index 6777e4e..35ddf9a 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java
@@ -1,28 +1,94 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.disposables.Disposable;
import io.reactivex.functions.Predicate;
+
/**
* Created by amitshekhar on 27/08/16.
*/
-public class FilterExampleActivity extends ExampleBaseActivity {
+public class FilterExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = FilterExampleActivity.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 by using filter operator to emit only even value
*
*/
- protected void doSomeWork() {
+ 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;
}
})
.subscribe(getObserver());
}
+
+ 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/FlowableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
index b80da45..2bf727f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java
@@ -1,70 +1,81 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
-import org.reactivestreams.Subscriber;
-import org.reactivestreams.Subscription;
+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.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.SingleObserver;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.BiFunction;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class FlowableExampleActivity extends ExampleBaseActivity {
+public class FlowableExampleActivity extends AppCompatActivity {
- private Subscription mSubscription;
+ private static final String TAG = FlowableExampleActivity.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 Flowable
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
- if (mSubscription != null) {
- mSubscription.cancel();
- }
+ Flowable observable = Flowable.just(1, 2, 3, 4);
- Flowable.range(0, 20)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribeWith(new Subscriber() {
+ observable.reduce(50, new BiFunction() {
+ @Override
+ public Integer apply(Integer t1, Integer t2) {
+ return t1 + t2;
+ }
+ }).subscribe(getObserver());
- //当订阅后,会首先调用这个方法,其实就相当于onStart(),
- //传入的Subscription s参数可以用于请求数据或者取消订阅
- @Override
- public void onSubscribe(Subscription s) {
- FlowableExampleActivity.this.onSubscribe("", null);
- mSubscription = s;
- //要说明一下,request这个方法若不调用,下游的onNext与OnComplete都不会调用;
- // 若你写的数量小于真实数据量,只会传你的个数,而且不会调用onComplete方法(毕竟没有传完嘛,当然没有complete)
- mSubscription.request(1);
- }
-
- @Override
- public void onNext(Integer o) {
- FlowableExampleActivity.this.onNext("", o);
- mSubscription.request(1);
- }
+ }
- @Override
- public void onError(Throwable t) {
- FlowableExampleActivity.this.onError("", t);
- }
+ private SingleObserver getObserver() {
- @Override
- public void onComplete() {
- FlowableExampleActivity.this.onComplete("");
- }
- });
+ return new SingleObserver() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
- }
+ @Override
+ public void onSuccess(Integer value) {
+ textView.append(" onSuccess : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onSuccess : value : " + value);
+ }
- @Override
- protected void onDestroy() {
- if (mSubscription != null) {
- mSubscription.cancel();
- }
- super.onDestroy();
+ @Override
+ public void onError(Throwable e) {
+ textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onError : " + e.getMessage());
+ }
+ };
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
index b516456..36baeaf 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java
@@ -1,21 +1,48 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.disposables.CompositeDisposable;
+import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class IntervalExampleActivity extends ExampleBaseActivity {
+public class IntervalExampleActivity extends AppCompatActivity {
+ private static final String TAG = IntervalExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
private final CompositeDisposable disposables = new CompositeDisposable();
+ @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();
+ }
+ });
+ }
+
@Override
protected void onDestroy() {
super.onDestroy();
@@ -26,17 +53,44 @@ protected void onDestroy() {
* simple example using interval to run task at an interval of 2 sec
* which start immediately
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
disposables.add(getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
// Be notified on the main thread
.observeOn(AndroidSchedulers.mainThread())
- .subscribeWith(this.getDisposableObserver()));
+ .subscribeWith(getObserver()));
}
private Observable extends Long> getObservable() {
return Observable.interval(0, 2, TimeUnit.SECONDS);
}
+ private DisposableObserver getObserver() {
+ return new DisposableObserver() {
+
+ @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");
+ }
+ };
+ }
+
+
}
\ No newline at end of file
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
index 2222afb..5cc3087 100644
--- 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
@@ -1,22 +1,79 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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();
+ }
+ });
+ }
- protected void doSomeWork() {
- getObservable()
- .last("Default") // the default item ("Default") to emit if the source ObservableSource is empty
- .subscribe(this.getSingleObserver());
+ /*
+ * 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/ui/operators/MapExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
index 3e4c2bc..29794ca 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java
@@ -1,23 +1,52 @@
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.ApiUser;
import com.rxjava2.android.samples.model.User;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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;
+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 amitshekhar on 27/08/16.
*/
-public class MapExampleActivity extends ExampleBaseActivity {
+public class MapExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = MapExampleActivity.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();
+ }
+ });
+ }
/*
* Here we are getting ApiUser Object from api server
@@ -25,7 +54,7 @@ public class MapExampleActivity extends ExampleBaseActivity {
* may be our database support User Not ApiUser Object
* Here we are using Map Operator to do that
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
@@ -34,7 +63,7 @@ protected void doSomeWork() {
.map(new Function, List>() {
@Override
- public List apply(List apiUsers) throws Exception {
+ public List apply(List apiUsers) {
return Utils.convertApiUserListToUserList(apiUsers);
}
})
@@ -44,7 +73,7 @@ public List apply(List apiUsers) throws Exception {
private Observable> getObservable() {
return Observable.create(new ObservableOnSubscribe>() {
@Override
- public void subscribe(ObservableEmitter> e) throws Exception {
+ public void subscribe(ObservableEmitter> e) {
if (!e.isDisposed()) {
e.onNext(Utils.getApiUserList());
e.onComplete();
@@ -53,4 +82,40 @@ public void subscribe(ObservableEmitter> e) throws Exception {
});
}
+ private Observer> getObserver() {
+ return new Observer>() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ 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(AppConstant.LINE_SEPARATOR);
+ }
+ Log.d(TAG, " onNext : " + userList.size());
+ }
+
+ @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/MergeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
index 0ef4fe2..01551bf 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java
@@ -1,20 +1,50 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.disposables.Disposable;
/**
* Created by amitshekhar on 28/08/16.
*/
-public class MergeExampleActivity extends ExampleBaseActivity {
+public class MergeExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = MergeExampleActivity.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 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
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
final String[] aStrings = {"A1", "A2", "A3", "A4"};
final String[] bStrings = {"B1", "B2", "B3"};
@@ -25,4 +55,37 @@ protected void doSomeWork() {
.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/PublishSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java
index a7e31f6..d03266b 100644
--- 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
@@ -1,41 +1,131 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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.
- */
- protected void doSomeWork() {
+ * by the source Observable, subsequent to the time of the subscription.
+ */
+ private void doSomeWork() {
- //PublishSubject就像鼠标事件,不管有没有订阅者,他都按照他的设定发事件,什么时候有订阅者,那么订阅者就从那个时候获取事件。
- //与之相反的是ReplaySubject,不管订阅者什么时候订阅,都能获取完整事件。
PublishSubject source = PublishSubject.create();
- source.onNext(-1);
- source.onNext(0);
- source.subscribe(this.getObserver("First")); // it will get 1, 2, 3, 4 and onComplete
+ source.subscribe(getFirstObserver()); // it will get 1, 2, 3, 4 and onComplete
source.onNext(1);
source.onNext(2);
source.onNext(3);
- //source.onComplete();//如果在这里onComplete了,那么后面的订阅者只能收到onComplete事件
/*
* it will emit 4 and onComplete for second observer also.
*/
- source.subscribe(this.getObserver("Second"));
+ 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/ReduceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
index 0722028..aa8aec1 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java
@@ -1,18 +1,48 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.MaybeObserver;
import io.reactivex.Observable;
+import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiFunction;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class ReduceExampleActivity extends ExampleBaseActivity {
+public class ReduceExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ReduceExampleActivity.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 reduce to add all the number
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
.reduce(new BiFunction() {
@Override
@@ -20,12 +50,42 @@ public Integer apply(Integer t1, Integer t2) {
return t1 + t2;
}
})
- .subscribe(this.getMaybeObserver());
+ .subscribe(getObserver());
}
private Observable getObservable() {
return Observable.just(1, 2, 3, 4);
}
+ private MaybeObserver getObserver() {
+ return new MaybeObserver() {
+ @Override
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
+ }
+
+ @Override
+ 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");
+ }
+ };
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
index 72ed85c..c1ce888 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java
@@ -1,27 +1,54 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.observables.ConnectableObservable;
import io.reactivex.subjects.PublishSubject;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class ReplayExampleActivity extends ExampleBaseActivity {
+public class ReplayExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ReplayExampleActivity.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 replay operator, replay ensure that all observers see the same sequence
* of emitted items, even if they subscribe after the Observable has begun emitting items
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
PublishSubject source = PublishSubject.create();
ConnectableObservable connectableObservable = source.replay(3); // bufferSize = 3 to retain 3 values to replay
connectableObservable.connect(); // connecting the connectableObservable
- source.onNext(-1);
- source.onNext(0);
- connectableObservable.subscribe(this.getObserver("First"));
+ connectableObservable.subscribe(getFirstObserver());
source.onNext(1);
source.onNext(2);
@@ -29,15 +56,74 @@ protected void doSomeWork() {
source.onNext(4);
source.onComplete();
-
/*
- * Replay操作符会给onComplete后订阅Observable的订阅者Replay发射最后几个元素。
- * 在onComplete之前订阅的不受影响(会收到完整的元素。哪怕在订阅之前已经开始onNext数据了)
- *
* it will emit 2, 3, 4 as (count = 3), retains the 3 values for replay
*/
- connectableObservable.subscribe(this.getObserver("Second"));
+ connectableObservable.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());
+ Log.d(TAG, " Second onError : " + e.getMessage());
+ }
+ @Override
+ public void onComplete() {
+ textView.append(" Second onComplete");
+ Log.d(TAG, " Second onComplete");
+ }
+ };
}
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
index 7692494..34bb5e4 100644
--- 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
@@ -1,45 +1,129 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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.
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
- //ReplaySubject 和 PublishSubject相反,
- //ReplaySubject不管订阅者什么时候订阅都能获取到完整的发射数据。
- //而PublishSubject会一直按照自己的步调发射数据,你在哪订阅就从这个时间点开始才能获取到事件
- //所谓的完整数据指的是从第一个onNext 一直到 onComplete 或 onError
ReplaySubject source = ReplaySubject.create();
-
- source.onNext(-1);
- source.onNext(0);
-
- source.subscribe(this.getObserver("First")); // it will get -1, 0, 1, 2, 3, 4, 5
+ 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, 0, 1, 2, 3, 4, 5 for second observer also as we have used replay
+ * it will emit 1, 2, 3, 4 for second observer also as we have used replay
*/
- source.subscribe(this.getObserver("Second"));
+ source.subscribe(getSecondObserver());
- source.onNext(5);
- 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");
+ }
+ };
}
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
index 100bcd6..0c263c2 100644
--- 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
@@ -1,18 +1,45 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+public class ScanExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = ScanExampleActivity.class.getSimpleName();
+ Button btn;
+ TextView textView;
- /* Using scan operator, apply a function to each item emitted by an Observable,
- * sequentially, and emit each successive value
- */
- protected void doSomeWork() {
+ @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())
@@ -20,16 +47,47 @@ protected void doSomeWork() {
.observeOn(AndroidSchedulers.mainThread())
.scan(new BiFunction() {
@Override
- public Integer apply(Integer int1, Integer int2) throws Exception {
+ public Integer apply(Integer int1, Integer int2) {
return int1 + int2;
}
})
.subscribe(getObserver());
- //Scan又叫累加器。将原始第一个与第二个应用函数的值作为第二个发射出去数据(第一个发射的数据就是原始第一个数据)
- //第三个发射的数据是原始第三个与第二个发射出去的应用函数后的值。
}
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/ui/operators/SimpleExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
index 694c858..6329b1b 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java
@@ -1,20 +1,49 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class SimpleExampleActivity extends ExampleBaseActivity {
+public class SimpleExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = SimpleExampleActivity.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 to emit two value one by one
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
@@ -27,5 +56,36 @@ private Observable getObservable() {
return Observable.just("Cricket", "Football");
}
+ 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/SingleObserverExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
index 5155e05..403f070 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java
@@ -1,47 +1,72 @@
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.ui.ExampleBaseActivity;
+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.SingleEmitter;
-import io.reactivex.SingleOnSubscribe;
-import io.reactivex.functions.Consumer;
-import io.reactivex.functions.Function;
+import io.reactivex.SingleObserver;
+import io.reactivex.disposables.Disposable;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class SingleObserverExampleActivity extends ExampleBaseActivity {
+public class SingleObserverExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = SingleObserverExampleActivity.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 SingleObserver
*/
- protected void doSomeWork() {
- Single.create(new SingleOnSubscribe() {
- @Override
- public void subscribe(SingleEmitter e) throws Exception {
- if (!e.isDisposed()) {
- e.onSuccess("Hello Success!");
- }
- }
- }).doOnSuccess(new Consumer() {
+ private void doSomeWork() {
+ Single.just("Amit")
+ .subscribe(getSingleObserver());
+ }
+
+ private SingleObserver getSingleObserver() {
+ return new SingleObserver() {
@Override
- public void accept(String s) throws Exception {
- Log.d(TAG, "doOnSuccess: " + s);
+ public void onSubscribe(Disposable d) {
+ Log.d(TAG, " onSubscribe : " + d.isDisposed());
}
- }).doOnError(new Consumer() {
+
@Override
- public void accept(Throwable throwable) throws Exception {
- Log.e(TAG, "doOnError: " + throwable.getMessage());
+ public void onSuccess(String value) {
+ textView.append(" onNext : value : " + value);
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onNext value : " + value);
}
- }).onErrorReturn(new Function() {
+
@Override
- public String apply(Throwable throwable) throws Exception {
- return "Exception message: " + throwable.getMessage();
+ public void onError(Throwable e) {
+ textView.append(" onError : " + e.getMessage());
+ textView.append(AppConstant.LINE_SEPARATOR);
+ Log.d(TAG, " onError : " + e.getMessage());
}
- }).subscribe(getSingleObserver());
+ };
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
index de1cf11..06ad8eb 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java
@@ -1,20 +1,49 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class SkipExampleActivity extends ExampleBaseActivity {
+public class SkipExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = SkipExampleActivity.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);
- /* Using skip operator, it only not emit
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* Using skip operator, it will not emit
* the first 2 values.
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
@@ -28,4 +57,36 @@ 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/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/ui/operators/TakeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
index 651b2c2..74b4b9f 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java
@@ -1,21 +1,49 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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.schedulers.Schedulers;
/**
* Created by amitshekhar on 27/08/16.
*/
-public class TakeExampleActivity extends ExampleBaseActivity {
+public class TakeExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = TakeExampleActivity.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);
- /*
- * Using take operator, it only emits
+ btn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ doSomeWork();
+ }
+ });
+ }
+
+ /* Using take operator, it only emits
* required number of values. here only 3 out of 5
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
@@ -29,4 +57,36 @@ 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/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
index 1872a64..a009cc1 100644
--- 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
@@ -1,13 +1,23 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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;
@@ -15,9 +25,33 @@
* Created by threshold on 2017/1/11.
*/
-public class ThrottleFirstExampleActivity extends ExampleBaseActivity {
+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);
- protected void doSomeWork() {
+ 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
@@ -33,26 +67,55 @@ private Observable getObservable() {
public void subscribe(ObservableEmitter emitter) throws Exception {
// send events with simulated time wait
Thread.sleep(0);
- emitter.onNext(1); // skip
- emitter.onNext(2); // deliver
+ emitter.onNext(1); // deliver
+ emitter.onNext(2); // skip
Thread.sleep(505);
- emitter.onNext(3); // skip
+ emitter.onNext(3); // deliver
Thread.sleep(99);
emitter.onNext(4); // skip
Thread.sleep(100);
emitter.onNext(5); // skip
- emitter.onNext(6); // deliver
+ emitter.onNext(6); // skip
Thread.sleep(305);
emitter.onNext(7); // deliver
Thread.sleep(510);
emitter.onComplete();
- /*
- 0----------500-------------1000----------1500
- 0------------505--604--704--1009----------1519
- 1,2-----------3----4---5,6----7-----------Complete
- */
}
});
}
-}
+ 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
index e2689b3..b48e208 100644
--- 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
@@ -1,27 +1,56 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 ExampleBaseActivity {
+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
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
.throttleLast(500, TimeUnit.MILLISECONDS)
// Run on a background thread
@@ -50,13 +79,42 @@ public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext(7); // deliver
Thread.sleep(510);
emitter.onComplete();
- /*
- 0----------500-------------1000----------1500
- 0------------505--604--704--1009----------1519
- 1,2-----------3----4---5,6----7-----------Complete
- */
}
});
}
+ 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/TimerExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
index 13a3b51..cbfa1e1 100644
--- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
+++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java
@@ -1,22 +1,51 @@
package com.rxjava2.android.samples.ui.operators;
-import com.rxjava2.android.samples.ui.ExampleBaseActivity;
+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 27/08/16.
*/
-public class TimerExampleActivity extends ExampleBaseActivity {
+public class TimerExampleActivity extends AppCompatActivity {
+
+ private static final String TAG = TimerExampleActivity.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 timer to do something after 2 second
*/
- protected void doSomeWork() {
+ private void doSomeWork() {
getObservable()
// Run on a background thread
.subscribeOn(Schedulers.io())
@@ -26,8 +55,39 @@ protected void doSomeWork() {
}
private Observable extends Long> getObservable() {
- //延迟2秒后发射一个0.
- // timer就是定时器,到点后仅发射一个0
return Observable.timer(2, TimeUnit.SECONDS);
}
+
+ private Observer getObserver() {
+ return new Observer() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ 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");
+ }
+ };
+ }
+
+
}
\ No newline at end of file
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
index fb841dc..881db12 100644
--- 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
@@ -1 +1,77 @@
-package com.rxjava2.android.samples.ui.operators;
import android.util.Log;
import com.rxjava2.android.samples.ui.ExampleBaseActivity;
import com.rxjava2.android.samples.utils.AppConstant;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
public class WindowExampleActivity extends ExampleBaseActivity {
/*
* Sample of window operator
*/
protected void doSomeWork() {
Observable.interval(1, TimeUnit.SECONDS).take(12)
.window(3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer>() {
@Override
public void accept(Observable