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