近段时间的学习碎片整理(16)

一、ViewModel的使用

可以引入fragment和activity的扩展

implementation "androidx.fragment:fragment-ktx:1.4.1"
implementation "androidx.activity:activity-ktx:1.4.0"

初始化就可以 private val viewModel: ViewModel by ViewModels初始化

没有引入扩展的情况下初始化:

private val viewModel by lazy {
        obtainViewModel(ViewModel::class.java)
    }

使用:

  viewModel.data.observe(this) {
            //里面就是获取到的数据
        }
                                                            
  viewModel.state.observe(this) {
            //监测状态,展示加载中、错误等不同状态时的控件
            binding.**.isVisible = it == DataState.LOADING
            binding.**.isVisible = it == DataState.ERROR
            binding.**.isVisible = it == DataState.SUCCESS
        }
BaseRepo类:
abstract class BaseRepo<D>(protected val dataKey: String, protected val timeKey: String) {
    protected val mmkv by lazy {
        //初始化mmkv
    }

    protected val gson by lazy {
        //初始化Gson
    }

    /**
     * 判断是否超时,超时返回当前时间戳,不超时返回0L
     */
    protected fun isOverDue(overTime: Long): Long {
        val lastTime = mmkv.getLong(timeKey, 0L)
        val currentTimeMillis = System.currentTimeMillis()
        return if (currentTimeMillis - lastTime <= overTime) {
            0L
        } else {
            currentTimeMillis
        }
    }

    /**
     * 保存请求网络的时间
     */
    protected fun saveTime(time: Long) {
        mmkv.encode(timeKey, time)
    }

    /**
     * 保存数据
     */
    protected fun saveData(data: D) {
        val toJson = gson.toJson(data)
        mmkv.encode(dataKey, toJson)
    }
}
NetBaseViewModel类:
abstract class NetBaseViewModel<D, S> : BaseViewModel<D>() {
    protected val service by lazy {
        getNetService(setService())
    }

    protected abstract fun setService(): Class<S>
}

仓库类可以继承BaseRepo类:

class ****Repo(private val service: NetService): BaseRepo<ArrayList<数据类型>>
    (存储数据的KEY,存储请求时间的Key){

    companion object {
        private const val OVER_DUE_TIME = 900000L //15分钟
    }

   
    suspend fun get****List(): ArrayList<数据类型> {
        val overDue = isOverDue(OVER_DUE_TIME)
        if (overDue == 0L) {
            val saveData = getSaveData()
            if (!saveData.isNullOrEmpty()) {
                return saveData
            }
        }
        val netData = getNetData()
        if (!netData.isNullOrEmpty()) {
            saveTime(overDue)
            saveData(netData)
        }

        val saveData = getSaveData()
        if (!saveData.isNullOrEmpty()) {
            return saveData
        }

        return arrayListOf()
    }

   
    private fun getSaveData(): ArrayList<数据类型> {
        try {
            val resultDataString = mmkv.getString(dataKey, "") ?: ""
            if (resultDataString.isEmpty()) return arrayListOf()
            val type = object : TypeToken<ArrayList<数据类型>>() {}.type
            return gson.fromJson(resultDataString, type)
        } catch (e: Throwable) {
            e.printStackTraceByDebug()
            return arrayListOf()
        }
    }

    /**
     * 获取网络数据
     */
    private suspend fun getNetData(): ArrayList<数据类型> {
        return try {
            val data = service.get***List()
            if (!data.isNullOrEmpty()) {
                return data
            }else {
                arrayListOf()
            }

        }catch (e: Throwable) {
            e.printStackTraceByDebug()
            arrayListOf()
        }
    }
}

ViewModel可以继承NetBaseViewModel类:

class *****VM : NetBaseViewModel<ArrayList<数据类型>, NetService>() {

    override fun setService() = NetService::class.java

    private val ****Repo by lazy {
        //初始化数据仓库
    }

    /**
     * 请求数据
     */
    fun getList() {
        viewModelScope.launch(Dispatchers.IO) {
            try {
                inState.postValue(DataState.LOADING)
                val List = anatomyRepo.get***List()
                if (List.isNullOrEmpty()) {
                    inState.postValue(DataState.ERROR)
                }else {
                    inState.postValue(DataState.SUCCESS)
                }
                inData.postValue(List)
            }catch (e: Throwable) {
                e.printStackTraceByDebug()
                inState.postValue(DataState.ERROR)
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值