From 1c323b5510d6bcf2034b9915085ecbe3b60c8580 Mon Sep 17 00:00:00 2001 From: Thanh Tuan Date: Thu, 26 Apr 2018 17:10:13 +0700 Subject: [PATCH 01/40] implement switch map operator sample --- README.md | 2 + app/src/main/AndroidManifest.xml | 2 + .../android/samples/ui/OperatorsActivity.java | 4 + .../operators/SwitchMapExampleActivity.java | 105 ++++++++++++++++++ .../main/res/layout/activity_operators.xml | 7 ++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 121 insertions(+) create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java diff --git a/README.md b/README.md index cba8124..fd697b0 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ RxJava1 -> RxJava2 * `Concat` -> emit the emissions from two or more Observables without interleaving them * `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` -> ransform the items emitted by an Observable into Observables, and mirror those items emitted by the most-recently transformed Observable # Highlights of the examples : @@ -101,6 +102,7 @@ RxJava1 -> RxJava2 * [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 * [MergeExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/MergeExampleActivity.java) - Using `merge` Operator * [DeferExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/DeferExampleActivity.java) - Using `defer` Observable +* [SwitchMapExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/SwitchMapExampleActivity.java) - Using `switchMap` Observable * [IntervalExampleActivity](https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/operators/IntervalExampleActivity.java) - Using `Interval` * [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 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c61e200..ec63671 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -126,6 +126,8 @@ + \ No newline at end of file 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..674d760 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 @@ -30,6 +30,7 @@ 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.ThrottleFirstExampleActivity; import com.rxjava2.android.samples.ui.operators.ThrottleLastExampleActivity; @@ -165,4 +166,7 @@ public void startDelayActivity(View view) { startActivity(new Intent(OperatorsActivity.this,DelayExampleActivity.class)); } + public void startSwitchMapActivity(View view) { + startActivity(new Intent(OperatorsActivity.this, SwitchMapExampleActivity.class)); + } } 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..127d611 --- /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.support.annotation.Nullable; +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.Random; +import java.util.concurrent.TimeUnit; + +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 = (Button) findViewById(R.id.btn); + textView = (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/res/layout/activity_operators.xml b/app/src/main/res/layout/activity_operators.xml index 1c453de..7a3c41c 100644 --- a/app/src/main/res/layout/activity_operators.xml +++ b/app/src/main/res/layout/activity_operators.xml @@ -225,5 +225,12 @@ android:text="@string/delay" android:textColor="@android:color/black" /> +