From f98616d0bcbb62f324972404ba1bfe0248856e00 Mon Sep 17 00:00:00 2001 From: zsxwing Date: Sat, 15 Feb 2014 22:36:04 +0800 Subject: [PATCH] Force ViewObservable be subscribed and unsubscribed in the UI thread --- .../rx/android/observables/ViewObservable.java | 6 ++++++ .../OperationObserveFromAndroidComponent.java | 13 +++++++++++-- .../rx/operators/OperatorCompoundButtonInput.java | 14 +++++++++++++- .../java/rx/operators/OperatorEditTextInput.java | 14 +++++++++++++- .../main/java/rx/operators/OperatorViewClick.java | 14 +++++++++++++- 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/rxjava-contrib/rxjava-android/src/main/java/rx/android/observables/ViewObservable.java b/rxjava-contrib/rxjava-android/src/main/java/rx/android/observables/ViewObservable.java index bb0832b590..6e31af051e 100644 --- a/rxjava-contrib/rxjava-android/src/main/java/rx/android/observables/ViewObservable.java +++ b/rxjava-contrib/rxjava-android/src/main/java/rx/android/observables/ViewObservable.java @@ -15,6 +15,7 @@ */ package rx.android.observables; +import android.os.Looper; import android.view.View; import android.widget.CompoundButton; import android.widget.EditText; @@ -37,5 +38,10 @@ public static Observable input(final CompoundButton button, final boole return Observable.create(new OperatorCompoundButtonInput(button, emitInitialValue)); } + public static void assertUiThread() { + if (Looper.getMainLooper() != Looper.myLooper()) { + throw new IllegalStateException("Observers must subscribe from the main UI thread, but was " + Thread.currentThread()); + } + } } diff --git a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperationObserveFromAndroidComponent.java b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperationObserveFromAndroidComponent.java index 169c99e9af..f0dca7d2f9 100644 --- a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperationObserveFromAndroidComponent.java +++ b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperationObserveFromAndroidComponent.java @@ -18,9 +18,11 @@ import rx.Observable; import rx.Observer; import rx.Subscription; +import rx.Scheduler.Inner; import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.Subscriptions; import rx.util.functions.Action0; +import rx.util.functions.Action1; import android.app.Activity; import android.os.Looper; import android.util.Log; @@ -100,8 +102,15 @@ public void onNext(T args) { @Override public void call() { log("unsubscribing from source sequence"); - releaseReferences(); - sourceSub.unsubscribe(); + AndroidSchedulers.mainThread().schedule(new Action1() { + + @Override + public void call(Inner t1) { + releaseReferences(); + sourceSub.unsubscribe(); + } + + }); } }); } diff --git a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorCompoundButtonInput.java b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorCompoundButtonInput.java index c945bc039a..f409410e4c 100644 --- a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorCompoundButtonInput.java +++ b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorCompoundButtonInput.java @@ -23,8 +23,12 @@ import rx.Observable; import rx.Subscriber; import rx.Subscription; +import rx.Scheduler.Inner; +import rx.android.observables.ViewObservable; +import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.Subscriptions; import rx.util.functions.Action0; +import rx.util.functions.Action1; import android.view.View; import android.widget.CompoundButton; @@ -39,6 +43,7 @@ public OperatorCompoundButtonInput(final CompoundButton button, final boolean em @Override public void call(final Subscriber observer) { + ViewObservable.assertUiThread(); final CompositeOnCheckedChangeListener composite = CachedListeners.getFromViewOrCreate(button); final CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() { @@ -51,7 +56,14 @@ public void onCheckedChanged(final CompoundButton button, final boolean checked) final Subscription subscription = Subscriptions.create(new Action0() { @Override public void call() { - composite.removeOnCheckedChangeListener(listener); + AndroidSchedulers.mainThread().schedule(new Action1() { + + @Override + public void call(Inner t1) { + composite.removeOnCheckedChangeListener(listener); + } + + }); } }); diff --git a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorEditTextInput.java b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorEditTextInput.java index 94e516bf3e..896fe3c7e5 100644 --- a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorEditTextInput.java +++ b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorEditTextInput.java @@ -18,8 +18,12 @@ import rx.Observable; import rx.Subscriber; import rx.Subscription; +import rx.Scheduler.Inner; +import rx.android.observables.ViewObservable; +import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.Subscriptions; import rx.util.functions.Action0; +import rx.util.functions.Action1; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; @@ -35,6 +39,7 @@ public OperatorEditTextInput(final EditText input, final boolean emitInitialValu @Override public void call(final Subscriber observer) { + ViewObservable.assertUiThread(); final TextWatcher watcher = new SimpleTextWatcher() { @Override public void afterTextChanged(final Editable editable) { @@ -45,7 +50,14 @@ public void afterTextChanged(final Editable editable) { final Subscription subscription = Subscriptions.create(new Action0() { @Override public void call() { - input.removeTextChangedListener(watcher); + AndroidSchedulers.mainThread().schedule(new Action1() { + + @Override + public void call(Inner t1) { + input.removeTextChangedListener(watcher); + } + + }); } }); diff --git a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorViewClick.java b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorViewClick.java index 32ed2de185..b6ea615a13 100644 --- a/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorViewClick.java +++ b/rxjava-contrib/rxjava-android/src/main/java/rx/operators/OperatorViewClick.java @@ -21,10 +21,14 @@ import java.util.WeakHashMap; import rx.Observable; +import rx.Scheduler.Inner; import rx.Subscriber; import rx.Subscription; +import rx.android.observables.ViewObservable; +import rx.android.schedulers.AndroidSchedulers; import rx.subscriptions.Subscriptions; import rx.util.functions.Action0; +import rx.util.functions.Action1; import android.view.View; public final class OperatorViewClick implements Observable.OnSubscribe { @@ -38,6 +42,7 @@ public OperatorViewClick(final View view, final boolean emitInitialValue) { @Override public void call(final Subscriber observer) { + ViewObservable.assertUiThread(); final CompositeOnClickListener composite = CachedListeners.getFromViewOrCreate(view); final View.OnClickListener listener = new View.OnClickListener() { @@ -50,7 +55,14 @@ public void onClick(final View clicked) { final Subscription subscription = Subscriptions.create(new Action0() { @Override public void call() { - composite.removeOnClickListener(listener); + AndroidSchedulers.mainThread().schedule(new Action1() { + + @Override + public void call(Inner t1) { + composite.removeOnClickListener(listener); + } + + }); } });