diff --git a/app/src/main/java/j4ckall/rxflux/lib/flux/Dispatcher.java b/app/src/main/java/j4ckall/rxflux/lib/flux/Dispatcher.java index a578b60..b0ba0a2 100644 --- a/app/src/main/java/j4ckall/rxflux/lib/flux/Dispatcher.java +++ b/app/src/main/java/j4ckall/rxflux/lib/flux/Dispatcher.java @@ -15,6 +15,7 @@ public class Dispatcher { private final Subject dispatcherSubject = PublishSubject.create().toSerialized(); + private final Observable dispatch = dispatcherSubject.hide(); public Dispatcher() { } @@ -39,4 +40,14 @@ final void dispatch(Action fluxAction) { dispatcherSubject.onNext(fluxAction); } + + /** + * dispatcherSubjectは公開したくない(外部からonNext出来る)ので + * Observableに変換して返す + * + * @return Observable + */ + public Observable getDispatch() { + return dispatch; + } } diff --git a/app/src/main/java/j4ckall/rxflux/lib/flux/Store.java b/app/src/main/java/j4ckall/rxflux/lib/flux/Store.java index 70f0dd0..202a101 100644 --- a/app/src/main/java/j4ckall/rxflux/lib/flux/Store.java +++ b/app/src/main/java/j4ckall/rxflux/lib/flux/Store.java @@ -1,5 +1,6 @@ package j4ckall.rxflux.lib.flux; +import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; @@ -80,6 +81,16 @@ }); } + /** + * DispatcherのObservableを取得する + * + * @param key Action識別子 + * @return + */ + protected Observable getDispatchObservable(Action.Key key) { + return dispatcher.getDispatch().filter(action -> action.key.equals(key)); + } + public void clear() { subscriptions.clear(); } diff --git a/app/src/main/java/j4ckall/rxflux/ui/MainActionCreater.java b/app/src/main/java/j4ckall/rxflux/ui/MainActionCreater.java index 53cd302..03a7095 100644 --- a/app/src/main/java/j4ckall/rxflux/ui/MainActionCreater.java +++ b/app/src/main/java/j4ckall/rxflux/ui/MainActionCreater.java @@ -19,7 +19,7 @@ } public void countDown(int num) { - dispatch(MainAction.COUNT_DOWN, num); + dispatch(MainAction.COUNT_DOWN, -num); } public void initialize(int num) { diff --git a/app/src/main/java/j4ckall/rxflux/ui/MainActivity.java b/app/src/main/java/j4ckall/rxflux/ui/MainActivity.java index cde3c29..7e1747e 100644 --- a/app/src/main/java/j4ckall/rxflux/ui/MainActivity.java +++ b/app/src/main/java/j4ckall/rxflux/ui/MainActivity.java @@ -4,12 +4,15 @@ import android.support.v7.app.AppCompatActivity; import android.widget.TextView; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import j4ckall.rxflux.R; public class MainActivity extends AppCompatActivity { private MainStore mainStore = new MainStore(); private MainActionCreater mainActionCreater = new MainActionCreater(); + private CompositeDisposable compositeDisposable = new CompositeDisposable(); private TextView countText = null; @Override @@ -25,11 +28,20 @@ findViewById(R.id.btn_minus).setOnClickListener(__ -> { mainActionCreater.countDown(1); }); + } - mainStore.observeOnMainThread(action -> { - countText.setText(mainStore.getCount().toString()); - }); - + @Override + protected void onResume() { + super.onResume(); + compositeDisposable.add( + mainStore.getCount().observeOn(AndroidSchedulers.mainThread()).subscribe(count -> countText.setText(count.toString())) + ); mainActionCreater.initialize(0); } + + @Override + protected void onDestroy() { + super.onDestroy(); + compositeDisposable.dispose(); + } } diff --git a/app/src/main/java/j4ckall/rxflux/ui/MainStore.java b/app/src/main/java/j4ckall/rxflux/ui/MainStore.java index 259e5bb..1701f4c 100644 --- a/app/src/main/java/j4ckall/rxflux/ui/MainStore.java +++ b/app/src/main/java/j4ckall/rxflux/ui/MainStore.java @@ -1,5 +1,10 @@ package j4ckall.rxflux.ui; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.BehaviorSubject; +import io.reactivex.subjects.Subject; import j4ckall.rxflux.App; import j4ckall.rxflux.lib.flux.Store; @@ -10,26 +15,52 @@ */ public class MainStore extends Store { - private int count; + private Subject countSubject = BehaviorSubject.create().toSerialized(); + private Observable count = countSubject.hide().scan((sum, num) -> sum += num); private boolean initialize = false; public MainStore() { super(App.getDispatcher()); - on(MainAction.COUNT_UP, action -> { - count += (Integer) action.value; - }); + getDispatchObservable(MainAction.COUNT_UP) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(action -> { + countSubject.onNext((Integer) action.value); + }); - on(MainAction.COUNT_DOWN, action -> { - count -= (Integer) action.value; - }); + getDispatchObservable(MainAction.COUNT_DOWN) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(action -> { + countSubject.onNext((Integer) action.value); + }); - on(MainAction.INITIALIZE, action -> { - count = (Integer) action.value; - }); + getDispatchObservable(MainAction.INITIALIZE) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(action -> { + if (!initialize) { + countSubject.onNext((Integer) action.value); + initialize = true; + } + }); + + // TODO:DispatchからObservableを受け取るのかDispatchに対してSubscriberを設定するのかどちらが良いのか調べる +// on(MainAction.COUNT_UP, action -> { +// countSubject.onNext((Integer) action.value); +// }); +// +// on(MainAction.COUNT_DOWN, action -> { +// countSubject.onNext((Integer) action.value); +// }); +// +// on(MainAction.INITIALIZE, action -> { +// countSubject.onNext((Integer) action.value); +// }); } - public Integer getCount() { + public Observable getCount() { return count; } }