viewmodel的封装

本文介绍了如何在Android开发中封装基础的BaseViewModel类,以及基于RxJava的RxViewModel,提供了一个简单的网络请求示例,展示了如何处理数据加载状态和生命周期绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久都没有写文章了,突然想写一下

没啥想法,就简单封装一下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}"
        })
    }
}

没了,就这样!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值