下面的流程结构我用了将近5次以上。因为大部分零件都是一样的。每个作业都有一个单独的用例。每个用例返回
Flow<Resource<MyType>>
。如何在 job1、job2... 函数使用的公共函数中组合相同的部分?
private var job1Job: Job? = null
private fun job1(param: Param) {
job1Job?.cancel()
job1Job = useCases1(param)
.onEach { resource->
myStateFlow.update {
it.copy(isConsumed = false,
resource = resource,
)
}
}
.catch {throwable->
var currentTryCount =
var maxTryCount =
if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
currentTryCount++
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Loading("loading message"),
currentTryCount = currentTryCount
)
}
throw BleReTryableError(throwable.message ?: "")
} else {
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Error("error message"))
}
}
}
.retry {
delay(2500)
it is BleReTryableError
}
.launchIn(viewModelScope)
}
private var job2Job: Job? = null
private fun job2(param: Param) {
job2Job?.cancel()
job2Job= useCases2(param)
.onEach { resource->
myStateFlow.update {
it.copy(isConsumed = false,
resource = resource,
)
}
}
.catch {throwable->
var currentTryCount =
var maxTryCount =
if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
currentTryCount++
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Loading("loading message"),
currentTryCount = currentTryCount
)
}
throw BleReTryableError(throwable.message ?: "")
} else {
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Error("error message"))
}
}
}
.retry {
delay(2500)
it is BleReTryableError
}
.launchIn(viewModelScope)
}
private var job3Job: Job? = null
private fun job3(param: Param) {
job3Job?.cancel()
job3Job= useCases3(param)
.onEach { resource->
myStateFlow.update {
it.copy(isConsumed = false,
resource = resource,
)
}
}
.catch {throwable->
var currentTryCount =
var maxTryCount =
if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
currentTryCount++
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Loading("loading message"),
currentTryCount = currentTryCount
)
}
throw BleReTryableError(throwable.message ?: "")
} else {
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Error("error message"))
}
}
}
.retry {
delay(2500)
it is BleReTryableError
}
.launchIn(viewModelScope)
}
或者做一个像下面这样的函数就足够了吗?
private fun myRun(flow: Flow<Resource<MyType>>) {
}
我也可以使用扩展方法
您可以像这样创建扩展函数:
fun <T> Flow<T>.process() {
onEach { resource->
myStateFlow.update {
it.copy(isConsumed = false,
resource = resource,
)
}
}
.catch {throwable->
var currentTryCount =
var maxTryCount =
if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
currentTryCount++
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Loading("loading message"),
currentTryCount = currentTryCount
)
}
throw BleReTryableError(throwable.message ?: "")
} else {
myStateFlow.update {
it.copy(isConsumed = false,
resource = Resource.Error("error message"))
}
}
}
.retry {
delay(2500)
it is BleReTryableError
}
.launchIn(viewModelScope)
}
然后像这样使用它
private var job1Job: Job? = null
private fun job1(param: Param) {
job1Job?.cancel()
job1Job = useCases1(param).process()
}
你拥有的每一份工作。