diff --git a/README.md b/README.md index 9248faf..fb85b8a 100644 --- a/README.md +++ b/README.md @@ -232,9 +232,16 @@ class MyReducer : Reducer { ```kotlin class PlusMiddleware : Middleware { - override fun apply(state: AppState, action: Action): Action = when (action) { - is ChangeNum -> - MultiTwo(action.newNum + 1) + override fun apply(state: AppState, action: Action, dispatch: (Action) -> Unit): Action = when (action) { + is ChangeNum -> { + Observable.just(action.newNum + 1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + dispatch(MultiTwo(it)) + } + NullAction + } else -> action } @@ -276,7 +283,7 @@ MyRedux.init(this) `Redux`的使用包括发送`Action`和监听`State`两个步骤。 ```kotlin // 发送Action -MyRedux.instance.dispatch(ChangeNum(number), false) +MyRedux.instance.dispatch(ChangeNum(number)) ``` ```kotlin // 监听State @@ -296,7 +303,7 @@ Single.just(ChangeNum(number)) // .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .subscribe({ - MyRedux.instance.dispatch(it, true) + MyRedux.instance.dispatch(it) }, { println("------>>error: ${it.message}") }) diff --git a/app/src/main/java/my/itgungnir/rxmvvm/MainActivity.kt b/app/src/main/java/my/itgungnir/rxmvvm/MainActivity.kt index 3003e65..1c3a001 100644 --- a/app/src/main/java/my/itgungnir/rxmvvm/MainActivity.kt +++ b/app/src/main/java/my/itgungnir/rxmvvm/MainActivity.kt @@ -31,7 +31,7 @@ class MainActivity : AppCompatActivity() { // .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .subscribe({ - MyRedux.instance.dispatch(it, true) + MyRedux.instance.dispatch(it) }, { println("------>>error: ${it.message}") }) diff --git a/common/src/main/java/my/itgungnir/rxmvvm/common/redux/action/NullAction.kt b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/action/NullAction.kt new file mode 100644 index 0000000..c1c54f0 --- /dev/null +++ b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/action/NullAction.kt @@ -0,0 +1,5 @@ +package my.itgungnir.rxmvvm.common.redux.action + +import my.itgungnir.rxmvvm.core.redux.Action + +object NullAction : Action \ No newline at end of file diff --git a/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/MultipleMiddleware.kt b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/MultipleMiddleware.kt index 6ecb344..608d4b9 100644 --- a/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/MultipleMiddleware.kt +++ b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/MultipleMiddleware.kt @@ -1,16 +1,27 @@ package my.itgungnir.rxmvvm.common.redux.middleware +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers import my.itgungnir.rxmvvm.common.redux.AppState import my.itgungnir.rxmvvm.common.redux.action.GetResult import my.itgungnir.rxmvvm.common.redux.action.MultiTwo +import my.itgungnir.rxmvvm.common.redux.action.NullAction import my.itgungnir.rxmvvm.core.redux.Action import my.itgungnir.rxmvvm.core.redux.Middleware class MultipleMiddleware : Middleware { - override fun apply(state: AppState, action: Action): Action = when (action) { - is MultiTwo -> - GetResult(action.number * 2) + override fun apply(state: AppState, action: Action, dispatch: (Action) -> Unit): Action = when (action) { + is MultiTwo -> { + Observable.just(action.number * 2) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + dispatch(GetResult(it)) + } + NullAction + } else -> action } diff --git a/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/PlusMiddleware.kt b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/PlusMiddleware.kt index 08a28cb..ae45a5a 100644 --- a/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/PlusMiddleware.kt +++ b/common/src/main/java/my/itgungnir/rxmvvm/common/redux/middleware/PlusMiddleware.kt @@ -1,16 +1,27 @@ package my.itgungnir.rxmvvm.common.redux.middleware +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers import my.itgungnir.rxmvvm.common.redux.AppState import my.itgungnir.rxmvvm.common.redux.action.ChangeNum import my.itgungnir.rxmvvm.common.redux.action.MultiTwo +import my.itgungnir.rxmvvm.common.redux.action.NullAction import my.itgungnir.rxmvvm.core.redux.Action import my.itgungnir.rxmvvm.core.redux.Middleware class PlusMiddleware : Middleware { - override fun apply(state: AppState, action: Action): Action = when (action) { - is ChangeNum -> - MultiTwo(action.newNum + 1) + override fun apply(state: AppState, action: Action, dispatch: (Action) -> Unit): Action = when (action) { + is ChangeNum -> { + Observable.just(action.newNum + 1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + dispatch(MultiTwo(it)) + } + NullAction + } else -> action } diff --git a/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/BaseRedux.kt b/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/BaseRedux.kt index 0e032a3..0699aa5 100644 --- a/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/BaseRedux.kt +++ b/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/BaseRedux.kt @@ -19,18 +19,15 @@ abstract class BaseRedux( private val currState = MutableLiveData().apply { value = currState() } - fun dispatch(action: Action, shouldSave: Boolean = false) { + fun dispatch(action: Action) { when (val newState = reducer.reduce(currState(), apply(action, 0))) { currState() -> Unit else -> { - if (Looper.getMainLooper() == Looper.myLooper()) { - currState.value = newState - } else { - currState.postValue(newState) - } - if (shouldSave) { - spUtil.serialize(newState) + when (Looper.getMainLooper() == Looper.myLooper()) { + true -> currState.value = newState + else -> currState.postValue(newState) } + spUtil.serialize(newState) } } } @@ -39,7 +36,7 @@ abstract class BaseRedux( if (index >= middlewareList.size) { return action } - return apply(middlewareList[index].apply(currState(), action), index + 1) + return apply(middlewareList[index].apply(currState(), action, ::dispatch), index + 1) } fun pick( @@ -65,14 +62,7 @@ abstract class BaseRedux( prop2: KProperty1, prop3: KProperty1, prop4: KProperty1 - ) = currState.map { state -> - Tuple4( - prop1.get(state), - prop2.get(state), - prop3.get(state), - prop4.get(state) - ) - } + ) = currState.map { state -> Tuple4(prop1.get(state), prop2.get(state), prop3.get(state), prop4.get(state)) } .distinctUntilChanged() fun currState(): T = deserializeToCurrState(spUtil.currState()) ?: initialState diff --git a/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/Middleware.kt b/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/Middleware.kt index b942f83..e635fcc 100644 --- a/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/Middleware.kt +++ b/rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/Middleware.kt @@ -2,5 +2,5 @@ package my.itgungnir.rxmvvm.core.redux interface Middleware { - fun apply(state: T, action: Action): Action + fun apply(state: T, action: Action, dispatch: (Action) -> Unit): Action } \ No newline at end of file