好久都没有写文章了,突然想写一下
没啥想法,就简单封装一下viewmodel。废话少说,直接上代码
一、定义一个base
open class BaseViewModel : ViewModel() {
/**
* 菊花
*/
val loading = MutableLiveData<Boolean>()
private var lifecycle: Lifecycle? = null
private var lifecycleOwner: LifecycleOwner? = null
fun setLifeCycle(lifecycle: Lifecycle) {
this.lifecycle = lifecycle
}
fun setLifecycleOwner(lifecycleOwner: LifecycleOwner) {
this.lifecycleOwner = lifecycleOwner
}
fun getLifeCycle(): Lifecycle = lifecycle!!
fun getLifecycleOwner(): LifecycleOwner = lifecycleOwner!!
}
二、以RxJava为例,创建一个RxViewModel继承BaseViewModel,再封装一层
open class RxViewModel : BaseViewModel() {
fun <T> call(
request: () -> Observable<T>,
success: (T) -> Unit,
failed: (ApiException) -> Unit =
{ ex -> YLogUtils.e("request error->code:${ex.code},message:${ex.message}") },
needBindLifecycle: Boolean = true
) {
loading.value = true
val observer = request.invoke().compose(RxHelper.handleSingleResult())
if (needBindLifecycle) {
observer.autoDispose(AndroidLifecycleScopeProvider.from(getLifecycleOwner()))
}
observer.subscribe(RxObserver<T>(doNext = {
loading.value = false
success.invoke(it)
}, doError = {
loading.value = false
failed.invoke(it)
}))
}
}
三、使用示例SimpleRxViewModel
class SimpleRxViewModel constructor(
private val userRepository: RxUserRepository
) : RxViewModel() {
private val data = MutableLiveData<String>()
fun getData(): LiveData<String> {
return data
}
fun getCode(phoneNum: String) {
YLogUtils.i("获取手机验证码--phoneNum", phoneNum)
call(request = {
userRepository.getCode(phoneNum)
}, success = {
YLogUtils.i("获取手机验证码--成功", it)
data.value = it.toString()
}, failed = {
YLogUtils.e("getCode failed:${it.code} , ${it.message}")
data.value = "code:${it.code},message:${it.message}"
})
}
}
没了,就这样!