Skip to content

Commit

Permalink
强化Middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
ITGungnir committed May 9, 2019
1 parent a7e6e31 commit 21e6cce
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 30 deletions.
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,9 +232,16 @@ class MyReducer : Reducer<AppState> {
```kotlin
class PlusMiddleware : Middleware<AppState> {

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
}
Expand Down Expand Up @@ -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
Expand All @@ -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}")
})
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/my/itgungnir/rxmvvm/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package my.itgungnir.rxmvvm.common.redux.action

import my.itgungnir.rxmvvm.core.redux.Action

object NullAction : Action
Original file line number Diff line number Diff line change
@@ -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<AppState> {

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
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<AppState> {

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
}
Expand Down
24 changes: 7 additions & 17 deletions rx_mvvm/src/main/java/my/itgungnir/rxmvvm/core/redux/BaseRedux.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,15 @@ abstract class BaseRedux<T>(

private val currState = MutableLiveData<T>().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)
}
}
}
Expand All @@ -39,7 +36,7 @@ abstract class BaseRedux<T>(
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 <A> pick(
Expand All @@ -65,14 +62,7 @@ abstract class BaseRedux<T>(
prop2: KProperty1<T, B>,
prop3: KProperty1<T, C>,
prop4: KProperty1<T, D>
) = 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package my.itgungnir.rxmvvm.core.redux

interface Middleware<T> {

fun apply(state: T, action: Action): Action
fun apply(state: T, action: Action, dispatch: (Action) -> Unit): Action
}

0 comments on commit 21e6cce

Please sign in to comment.