diff --git a/README.md b/README.md index cba8124..8aa4e01 100644 --- a/README.md +++ b/README.md @@ -2,139 +2,111 @@ # Learning RxJava 2 for Android by example -[![Mindorks](https://img.shields.io/badge/mindorks-opensource-blue.svg)](https://mindorks.com/open-source-projects) -[![Mindorks Community](https://img.shields.io/badge/join-community-blue.svg)](https://mindorks.com/join-community) -[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-RxJava2%20Android%20Samples-blue.svg?style=flat)](https://android-arsenal.com/details/3/4314) -[![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=102)](https://opensource.org/licenses/Apache-2.0) -[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/LICENSE) - -### [Get the complete RxJava Course Here](https://mindorks.com/course/learn-rxjava) - -## How to use RxJava 2 in Android Application -## How to migrate from RxJava 1.0 to RxJava 2.0 - ### This project is for : * who is migrating to RxJava 2 * or just started with RxJava. -### Just Build the project and start learning RxJava by examples. +## About me -RxJava 2.0 has been completely rewritten from scratch on top of the Reactive-Streams specification. The specification itself has evolved out of RxJava 1.x and provides a common baseline for reactive systems and libraries. +Hi, I am Amit Shekhar, Founder @ [Outcome School](https://outcomeschool.com) • IIT 2010-14 • I have taught and mentored many developers, and their efforts landed them high-paying tech jobs, helped many tech companies in solving their unique problems, and created many open-source libraries being used by top companies. I am passionate about sharing knowledge through open-source, blogs, and videos. + +### Follow Amit Shekhar + +- [X/Twitter](https://twitter.com/amitiitbhu) +- [LinkedIn](https://www.linkedin.com/in/amit-shekhar-iitbhu) +- [GitHub](https://github.com/amitshekhariitbhu) -Because Reactive-Streams has a different architecture, it mandates changes to some well known RxJava types. +### Follow Outcome School +- [YouTube](https://youtube.com/@OutcomeSchool) +- [X/Twitter](https://x.com/outcome_school) +- [LinkedIn](https://www.linkedin.com/company/outcomeschool) +- [GitHub](http://github.com/OutcomeSchool) -# Migration From RxJava 1.0 to RxJava 2.0 +## I teach at 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. +- AI and Machine Learning +- Android -Users switching from 1.x to 2.x have to re-organize their imports, but carefully. +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.1.1' +compile 'io.reactivex.rxjava2:rxjava:X.X.X' ``` If you are using RxAndroid also, then add the following ```groovy -compile 'io.reactivex.rxjava2:rxandroid:2.0.1' +compile 'io.reactivex.rxjava2:rxandroid:X.X.X' ``` -# RxJava 2 Examples present in this sample project - -* RxJava 2.0 Example using `CompositeDisposable` as `CompositeSubscription` and `Subscription` have -been removed. - -* RxJava 2 Example using `Flowable`. +# RxJava 2 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/ui/operators/DisposableExampleActivity.java) - Using `CompositeDisposable` +* [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 +* [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 +* [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 +* [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 -* [IntervalExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java) - Using `Interval` -* [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, [Blog for reference](https://blog.mindorks.com/implementing-eventbus-with-rxjava-rxbus-e6c940a94bd8) -* [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 +* [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`, [Blog for reference](https://blog.mindorks.com/implement-search-using-rxjava-operators-c8882b64fe1d) - -### TODO - -* Many examples are to be added +* [Search Implementation](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/search/SearchActivity.java) - Using `debounce`, `switchMap`, `distinctUntilChanged` +* [Implement Caching Using RxJava Operators](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java) - Using `concat`, `firstElement` +* [PublishSubjectExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java). Blog: [RxJava Subject - Publish, Replay, Behavior, and Async](https://outcomeschool.com/blog/rxjava-subject-publish-replay-behavior-async) ### Find this project useful ? :heart: * Support it by clicking the :star: button on the upper right of this page. :v: -### Check out an awesome MVP architecture based project which uses RxJava2, Dagger2. -* [Android-MVP-Architecture](https://github.com/MindorksOpenSource/android-mvp-architecture) +Thanks -### Check out an awesome library for fast and simple networking in Android. -* [Fast Android Networking Library](https://github.com/amitshekhariitbhu/Fast-Android-Networking) +**Amit Shekhar**\ +Co-Founder @ [Outcome School](https://outcomeschool.com) -### Another awesome library for debugging databases and shared preferences. -* [Android Debug Database](https://github.com/amitshekhariitbhu/Android-Debug-Database) +You can connect with me on: -### [Check out Mindorks awesome open source projects here](https://mindorks.com/open-source-projects) - -### Contact - Let's become friend - [Twitter](https://twitter.com/amitiitbhu) -- [Github](https://github.com/amitshekhariitbhu) -- [Medium](https://medium.com/@amitshekhar) +- [LinkedIn](https://www.linkedin.com/in/amit-shekhar-iitbhu) +- [GitHub](https://github.com/amitshekhariitbhu) - [Facebook](https://www.facebook.com/amit.shekhar.iitbhu) +[**Read all of our blogs here.**](https://outcomeschool.com/blog) + ### License ``` - Copyright (C) 2016 Amit Shekhar - Copyright (C) 2011 Android Open Source Project + Copyright (C) 2024 Amit Shekhar Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -151,5 +123,4 @@ RxJava1 -> RxJava2 ### Contributing to RxJava 2 Android Samples Just make pull request. You are in! - diff --git a/app/build.gradle b/app/build.gradle index 62fe87b..fe13a5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 28 + buildToolsVersion "28.0.2" defaultConfig { applicationId "com.rxjava2.android.samples" minSdkVersion 16 - targetSdkVersion 25 + targetSdkVersion 28 versionCode 1 versionName "1.0" } @@ -17,14 +17,25 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.android.support:recyclerview-v7:25.1.0' - compile 'io.reactivex.rxjava2:rxjava:2.1.1' - compile 'io.reactivex.rxjava2:rxandroid:2.0.1' - compile 'com.amitshekhar.android:rx2-android-networking:1.0.0' + 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 c61e200..720343a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ + @@ -126,6 +129,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/rxjava2/android/samples/MyApplication.java b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java index d4df621..781cb30 100644 --- a/app/src/main/java/com/rxjava2/android/samples/MyApplication.java +++ b/app/src/main/java/com/rxjava2/android/samples/MyApplication.java @@ -33,7 +33,7 @@ public void sendAutoEvent() { Observable.timer(2, TimeUnit.SECONDS) .subscribe(new Consumer() { @Override - public void accept(Long aLong) throws Exception { + public void accept(Long aLong) { bus.send(new Events.AutoEvent()); } }); diff --git a/app/src/main/java/com/rxjava2/android/samples/model/Car.java b/app/src/main/java/com/rxjava2/android/samples/model/Car.java index e223650..a5ecffa 100644 --- a/app/src/main/java/com/rxjava2/android/samples/model/Car.java +++ b/app/src/main/java/com/rxjava2/android/samples/model/Car.java @@ -19,7 +19,7 @@ public void setBrand(String brand) { public Observable brandDeferObservable() { return Observable.defer(new Callable>() { @Override - public ObservableSource call() throws Exception { + public ObservableSource call() { return Observable.just(brand); } }); 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 bb11397..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 @@ -27,4 +27,22 @@ public String toString() { ", 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/ui/OperatorsActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java index 63df8a2..3986c9a 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/OperatorsActivity.java @@ -2,7 +2,6 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; import com.rxjava2.android.samples.R; @@ -30,13 +29,18 @@ 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 @@ -165,4 +169,15 @@ 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 index d3c6082..fd392dd 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java @@ -2,17 +2,19 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; 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 @@ -29,6 +31,10 @@ public void startNetworkingActivity(View view) { startActivity(new Intent(SelectionActivity.this, NetworkingActivity.class)); } + public void startCacheActivity(View view) { + startActivity(new Intent(SelectionActivity.this, CacheExampleActivity.class)); + } + public void startRxBusActivity(View view) { ((MyApplication) getApplication()).sendAutoEvent(); startActivity(new Intent(SelectionActivity.this, RxBusActivity.class)); diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java new file mode 100644 index 0000000..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 index faf2291..89ab45b 100644 --- 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 @@ -1,10 +1,10 @@ package com.rxjava2.android.samples.ui.compose; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import com.rxjava2.android.samples.R; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Flowable; import io.reactivex.Observable; 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 index f651870..6878e3a 100644 --- 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 @@ -1,11 +1,12 @@ package com.rxjava2.android.samples.ui.networking; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; 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; @@ -52,7 +53,7 @@ public void map(View view) { .observeOn(AndroidSchedulers.mainThread()) .map(new Function() { @Override - public User apply(ApiUser apiUser) throws Exception { + public User apply(ApiUser apiUser) { // here we get ApiUser from server User user = new User(apiUser); // then by converting, we are returning user @@ -93,29 +94,31 @@ public void onComplete() { private Observable> getCricketFansObservable() { return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllCricketFans") .build() - .getObjectListObservable(User.class); + .getObjectListObservable(User.class) + .subscribeOn(Schedulers.io()); } /* - * This observable return the list of User who loves Football - */ + * 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); + .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 - */ + * 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) throws Exception { + public List apply(List cricketFans, List footballFans) { List userWhoLovesBoth = filterUserWhoLovesBoth(cricketFans, footballFans); return userWhoLovesBoth; @@ -152,13 +155,13 @@ public void onComplete() { private List filterUserWhoLovesBoth(List cricketFans, List footballFans) { List userWhoLovesBoth = new ArrayList<>(); - for (User cricketFan : cricketFans) { - for (User footballFan : footballFans) { - if (cricketFan.id == footballFan.id) { - userWhoLovesBoth.add(cricketFan); - } + + for (User footballFan : footballFans) { + if (cricketFans.contains(footballFan)) { + userWhoLovesBoth.add(footballFan); } } + return userWhoLovesBoth; } @@ -183,13 +186,13 @@ public void flatMapAndFilter(View view) { getAllMyFriendsObservable() .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one @Override - public ObservableSource apply(List usersList) throws Exception { + 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) throws Exception { + public boolean test(User user) { // filtering user who follows me. return user.isFollowing; } @@ -229,7 +232,7 @@ public void take(View view) { getUserListObservable() .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one @Override - public ObservableSource apply(List usersList) throws Exception { + public ObservableSource apply(List usersList) { return Observable.fromIterable(usersList); // returning user one by one from usersList. } }) @@ -269,13 +272,13 @@ public void flatMap(View view) { getUserListObservable() .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one @Override - public ObservableSource apply(List usersList) throws Exception { + 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) throws Exception { + public ObservableSource apply(User user) { // here we get the user one by one // and returns corresponding getUserDetailObservable // for that userId @@ -331,13 +334,13 @@ public void flatMapWithZip(View view) { getUserListObservable() .flatMap(new Function, ObservableSource>() { // flatMap - to return users one by one @Override - public ObservableSource apply(List usersList) throws Exception { + 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) throws Exception { + 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 @@ -345,7 +348,7 @@ public ObservableSource> apply(User user) throws Exceptio Observable.just(user), new BiFunction>() { @Override - public Pair apply(UserDetail userDetail, User user) throws Exception { + 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) diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java index 501bc63..d2243a2 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/AsyncSubjectExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,8 +28,8 @@ public class AsyncSubjectExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java index e398fd8..9eeadd0 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BehaviorSubjectExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,8 +28,8 @@ public class BehaviorSubjectExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java index ead4b70..9171136 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/BufferExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.List; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; @@ -29,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java index 1f7451a..4ee612f 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/CompletableObserverExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Completable; import io.reactivex.CompletableObserver; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -31,8 +31,8 @@ public class CompletableObserverExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java index ce4a3f5..8bb3e2b 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ConcatExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -27,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java index d0f9802..7837381 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DebounceExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -34,8 +34,8 @@ public class DebounceExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java index 4aed8c6..0e6249c 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -11,6 +10,7 @@ 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; @@ -28,8 +28,8 @@ public class DeferExampleActivity 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 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 index 2979e75..212092c 100644 --- 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 @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -32,8 +32,8 @@ public class DelayExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java index 2dd124b..9e51b3c 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DisposableExampleActivity.java @@ -2,7 +2,6 @@ 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; @@ -13,6 +12,7 @@ import java.util.concurrent.Callable; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -34,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 @@ -88,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"); diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java index 8e5f2f6..af2c0e3 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/DistinctExampleActivity.java @@ -1,8 +1,6 @@ package com.rxjava2.android.samples.ui.operators; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; @@ -11,6 +9,8 @@ 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; @@ -28,8 +28,8 @@ public class DistinctExampleActivity extends AppCompatActivity { protected void onCreate(@Nullable 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java index e470182..35ddf9a 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FilterExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -29,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 @@ -48,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; } }) diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java index 7303cc2..2bf727f 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/FlowableExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java index 22469be..36baeaf 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ 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; @@ -32,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java index b1c86ff..5cc3087 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/LastOperatorExampleActivity.java @@ -1,8 +1,6 @@ package com.rxjava2.android.samples.ui.operators; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; @@ -11,6 +9,8 @@ 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; @@ -29,8 +29,8 @@ public class LastOperatorExampleActivity extends AppCompatActivity { protected void onCreate(@Nullable 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java index ccc6ace..29794ca 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MapExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -15,6 +14,7 @@ import java.util.List; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -37,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 @@ -63,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); } }) @@ -73,7 +73,7 @@ public List apply(List apiUsers) throws Exception { private Observable> getObservable() { return Observable.create(new ObservableOnSubscribe>() { @Override - public void subscribe(ObservableEmitter> e) throws Exception { + public void subscribe(ObservableEmitter> e) { if (!e.isDisposed()) { e.onNext(Utils.getApiUserList()); e.onComplete(); diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java index 0cd7487..01551bf 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -27,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java index af8822c..d03266b 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/PublishSubjectExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,8 +28,8 @@ public class PublishSubjectExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java index 1ab9930..aa8aec1 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReduceExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ import com.rxjava2.android.samples.R; import com.rxjava2.android.samples.utils.AppConstant; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.MaybeObserver; import io.reactivex.Observable; import io.reactivex.disposables.Disposable; @@ -28,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java index 8880ea9..c1ce888 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplayExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java index 7f09563..34bb5e4 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ReplaySubjectExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -28,8 +28,8 @@ public class ReplaySubjectExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java index f70e667..0c263c2 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ScanExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -27,8 +27,8 @@ public class ScanExampleActivity 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,7 +47,7 @@ private void doSomeWork() { .observeOn(AndroidSchedulers.mainThread()) .scan(new BiFunction() { @Override - public Integer apply(Integer int1, Integer int2) throws Exception { + public Integer apply(Integer int1, Integer int2) { return int1 + int2; } }) diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java index 423047d..6329b1b 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SimpleExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -29,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java index 6c9ce7c..403f070 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SingleObserverExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -27,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java index 26706ea..06ad8eb 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SkipExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -29,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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java new file mode 100644 index 0000000..d787bc5 --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java @@ -0,0 +1,105 @@ +package com.rxjava2.android.samples.ui.operators; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.rxjava2.android.samples.R; +import com.rxjava2.android.samples.utils.AppConstant; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import io.reactivex.Observable; +import io.reactivex.ObservableSource; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by thanhtuan on 26/04/18. + */ +public class SwitchMapExampleActivity extends AppCompatActivity { + + private static final String TAG = SwitchMapExampleActivity.class.getSimpleName(); + Button btn; + TextView textView; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_example); + + btn = findViewById(R.id.btn); + textView = findViewById(R.id.textView); + + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + doSomeWork(); + } + }); + } + + /* whenever a new item is emitted by the source Observable, it will unsubscribe to and stop + * mirroring the Observable that was generated from the previously-emitted item, + * and begin only mirroring the current one. + * + * Result: 5x + */ + private void doSomeWork() { + getObservable() + .switchMap(new Function>() { + @Override + public ObservableSource apply(Integer integer) { + int delay = new Random().nextInt(2); + + return Observable.just(integer.toString() + "x") + .delay(delay, TimeUnit.SECONDS, Schedulers.io()); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getObserver()); + } + + private Observable getObservable() { + return Observable.just(1, 2, 3, 4, 5); + } + + private Observer getObserver() { + return new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.d(TAG, " onSubscribe : " + d.isDisposed()); + } + + @Override + public void onNext(String value) { + textView.append(" onNext : value : " + value); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onNext value : " + value); + } + + @Override + public void onError(Throwable e) { + textView.append(" onError : " + e.getMessage()); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onError : " + e.getMessage()); + } + + @Override + public void onComplete() { + textView.append(" onComplete"); + textView.append(AppConstant.LINE_SEPARATOR); + Log.d(TAG, " onComplete"); + } + }; + } +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java index ae71924..74b4b9f 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TakeExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -10,6 +9,7 @@ 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; @@ -29,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 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 index 28c6ae7..a009cc1 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleFirstExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleFirstExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -35,8 +35,8 @@ public class ThrottleFirstExampleActivity 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 @@ -67,15 +67,15 @@ private Observable getObservable() { public void subscribe(ObservableEmitter emitter) throws Exception { // send events with simulated time wait Thread.sleep(0); - emitter.onNext(1); // skip - emitter.onNext(2); // deliver + emitter.onNext(1); // deliver + emitter.onNext(2); // skip Thread.sleep(505); - emitter.onNext(3); // skip + emitter.onNext(3); // deliver Thread.sleep(99); emitter.onNext(4); // skip Thread.sleep(100); emitter.onNext(5); // skip - emitter.onNext(6); // deliver + emitter.onNext(6); // skip Thread.sleep(305); emitter.onNext(7); // deliver Thread.sleep(510); diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java index 95b6a45..b48e208 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ThrottleLastExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -34,8 +34,8 @@ public class ThrottleLastExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java index 17f6369..cbfa1e1 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/TimerExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,6 +11,7 @@ import java.util.concurrent.TimeUnit; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -31,8 +31,8 @@ public class TimerExampleActivity 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 diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java index 672d3ce..881db12 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/WindowExampleActivity.java @@ -1 +1,77 @@ -package com.rxjava2.android.samples.ui.operators; import android.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 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 = (Button) findViewById(R.id.btn); textView = (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) throws Exception { 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); } }); } }; } } \ No newline at end of file +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/ui/operators/ZipExampleActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java index af446f3..11cb394 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/operators/ZipExampleActivity.java @@ -1,7 +1,6 @@ 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; @@ -14,6 +13,7 @@ import java.util.List; +import androidx.appcompat.app.AppCompatActivity; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -36,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 @@ -48,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); } }) @@ -71,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 { + 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 { + public void subscribe(ObservableEmitter> e) { if (!e.isDisposed()) { e.onNext(Utils.getUserListWhoLovesFootball()); e.onComplete(); } } - }); + }).subscribeOn(Schedulers.io()); } private Observer> getObserver() { 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 index b68b312..e9c89a9 100644 --- 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 @@ -1,28 +1,25 @@ package com.rxjava2.android.samples.ui.pagination; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ProgressBar; -import com.rxjava2.android.samples.R; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; -import org.reactivestreams.Publisher; +import com.rxjava2.android.samples.R; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import io.reactivex.Flowable; +import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.annotations.NonNull; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; -import io.reactivex.functions.Function; import io.reactivex.processors.PublishProcessor; +import io.reactivex.schedulers.Schedulers; /** * Created by amitshekhar on 15/03/17. @@ -47,10 +44,10 @@ public class PaginationActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pagination); - recyclerView = (RecyclerView) findViewById(R.id.recyclerView); - progressBar = (ProgressBar) findViewById(R.id.progressBar); + recyclerView = findViewById(R.id.recyclerView); + progressBar = findViewById(R.id.progressBar); layoutManager = new LinearLayoutManager(this); - layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + layoutManager.setOrientation(RecyclerView.VERTICAL); recyclerView.setLayoutManager(layoutManager); paginationAdapter = new PaginationAdapter(); recyclerView.setAdapter(paginationAdapter); @@ -94,23 +91,23 @@ private void subscribeForData() { Disposable disposable = paginator .onBackpressureDrop() - .concatMap(new Function>>() { - @Override - public Publisher> apply(@NonNull Integer page) throws Exception { - loading = true; - progressBar.setVisibility(View.VISIBLE); - return dataFromNetwork(page); - } + .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(new Consumer>() { - @Override - public void accept(@NonNull List items) throws Exception { - paginationAdapter.addItems(items); - paginationAdapter.notifyDataSetChanged(); - loading = false; - progressBar.setVisibility(View.INVISIBLE); - } + .subscribe(items -> { + paginationAdapter.addItems(items); + paginationAdapter.notifyDataSetChanged(); + loading = false; + progressBar.setVisibility(View.INVISIBLE); }); compositeDisposable.add(disposable); @@ -122,18 +119,15 @@ public void accept(@NonNull List items) throws Exception { /** * Simulation of network data */ - private Flowable> dataFromNetwork(final int page) { - return Flowable.just(true) + private Single> dataFromNetwork(final int page) { + return Single.just(true) .delay(2, TimeUnit.SECONDS) - .map(new Function>() { - @Override - public List apply(@NonNull Boolean value) throws Exception { - List items = new ArrayList<>(); - for (int i = 1; i <= 10; i++) { - items.add("Item " + (page * 10 + i)); - } - return items; + .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 index 9c9d162..ddc0402 100644 --- 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 @@ -1,6 +1,5 @@ package com.rxjava2.android.samples.ui.pagination; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,6 +10,8 @@ import java.util.ArrayList; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; + /** * Created by amitshekhar on 15/03/17. */ 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 index 2911b42..a991e5e 100644 --- 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 @@ -1,7 +1,6 @@ package com.rxjava2.android.samples.ui.rxbus; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; @@ -10,6 +9,7 @@ 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; @@ -36,8 +36,8 @@ protected void onDestroy() { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rxbus); - textView = (TextView) findViewById(R.id.textView); - button = (Button) findViewById(R.id.button); + textView = findViewById(R.id.textView); + button = findViewById(R.id.button); disposables.add(((MyApplication) getApplication()) .bus() @@ -46,7 +46,7 @@ protected void onCreate(Bundle savedInstanceState) { .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override - public void accept(Object object) throws Exception { + public void accept(Object object) { if (object instanceof Events.AutoEvent) { textView.setText("Auto Event Received"); } else if (object instanceof 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 index 6360030..9189214 100644 --- 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 @@ -22,7 +22,7 @@ public static Observable fromView(SearchView searchView) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { - subject.onComplete(); + subject.onNext(s); return true; } 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 index 2382286..d9353c9 100644 --- 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 @@ -1,10 +1,11 @@ package com.rxjava2.android.samples.ui.search; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.widget.SearchView; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; + import com.rxjava2.android.samples.R; import java.util.concurrent.TimeUnit; @@ -32,8 +33,8 @@ public class SearchActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); - searchView = (SearchView) findViewById(R.id.searchView); - textViewResult = (TextView) findViewById(R.id.textViewResult); + searchView = findViewById(R.id.searchView); + textViewResult = findViewById(R.id.textViewResult); setUpSearchObservable(); } @@ -43,7 +44,7 @@ private void setUpSearchObservable() { .debounce(300, TimeUnit.MILLISECONDS) .filter(new Predicate() { @Override - public boolean test(String text) throws Exception { + public boolean test(String text) { if (text.isEmpty()) { textViewResult.setText(""); return false; @@ -55,15 +56,20 @@ public boolean test(String text) throws Exception { .distinctUntilChanged() .switchMap(new Function>() { @Override - public ObservableSource apply(String query) throws Exception { - return dataFromNetwork(query); + 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) throws Exception { + public void accept(String result) { textViewResult.setText(result); } }); @@ -77,7 +83,7 @@ private Observable dataFromNetwork(final String query) { .delay(2, TimeUnit.SECONDS) .map(new Function() { @Override - public String apply(@NonNull Boolean value) throws Exception { + public String apply(@NonNull Boolean value) { return query; } }); 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 04695b2..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 @@ -76,6 +76,11 @@ public static List convertApiUserListToUserList(List apiUserList) return userList; } + public static List convertApiUserListToApiUserList(List apiUserList) { + return apiUserList; + } + + public static List getUserListWhoLovesCricket() { List userList = new ArrayList<>(); diff --git a/app/src/main/res/layout/activity_operators.xml b/app/src/main/res/layout/activity_operators.xml index 1c453de..095a030 100644 --- a/app/src/main/res/layout/activity_operators.xml +++ b/app/src/main/res/layout/activity_operators.xml @@ -4,10 +4,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fadeScrollbars="false" - android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.rxjava2.android.samples.ui.OperatorsActivity"> +