0%

Android_MVVM项目结构整理

MVVM项目结构整理

基于Kotlin/Dagger2/RxJava/RxAndroid/Retrofit/Okhttp/ViewModel/LiveData等来实现

  1. 框架结构整理

MVVM – Model View ViewModel 的方式来实现

a.MVC/MVP/MVVM项目结构的区别

  1. 相关代码整理

a. KeyPaginator

1
2
3
4
5
6
7
8
9
10
11
12
13
paginator = KeyPaginator<Unit, Int, Pageable<PickOrderInfo>, PickOrderInfo>(
refresh = refresh,
next = nextPage,
nextKey = { if (it.list.isEmpty()) it.pageIndex else it.pageIndex + 1 },
dataTransformation = { it.list },
loadInitial = {
client.getOrderBySortPerson(1).toObservable()
},
loadAfter = { params, key ->
client.getOrderBySortPerson(key).toObservable()
},
pipeErrorsTo = { error(it) }
)

b. takeWhenPair

1
2
3
4
5
6
7
8
9
10
11
12
13
selectedProducts.takeWhenPair(productSelected)
.map { (list, pair) ->
val (product, selected) = pair
val newProducts = ArrayList(list)
if (selected) {
newProducts.add(product)
} else {
newProducts.removeAll { it.id == product.id }
}
newProducts
}
.autoDisposable(this)
.subscribe(selectedProducts)

c.Input/Output

1
2
3
4
5
6
7
8
9
10
11
12
13
private val requestPickingGoodsOrderDetail = PublishSubject.create<String>()

private var pickingOrderDetail: Observable<PickingGoodsOrderDetail>

//获取订单详情
pickingOrderDetail = requestPickingGoodsOrderDetail
.filter { it.isNotEmpty() }
.doOnNext { showProgress() }
.flatMapSingle {
client.newPickingOrderGoods(it).pipeErrorsTo(error)
//client.pickingOrderGoods(it).pipeErrorsTo(error)
}
.doOnNext { dismissProgress() }

d. StringPreference.java

Link: Original: https://github.com/JakeWharton/u2020/blob/7363d27ee0356e24dcbd00dc6926d993ee56d6e2/src/main/java/com/jakewharton/u2020/data/prefs/StringPreference.java

e.LiveData

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/**
* 获取订单详情
*/
fun getPersonalOrderDetail(
orderNo: String,
owner: LifecycleOwner,
onGetOrderDetailSuccess: (OrderDetail) -> Unit
) {

repository.getPersonalOrderDetail(orderNo)
.observe(owner, Observer { resource ->
resource?.work(
onSuccess = {
resource.data?.let {
onGetOrderDetailSuccess(it)
}

},
onLoading = { true }
)
})
}