不使用第三方库实现Repository向ViewModel传递数据的方案
Android原生实现Repository到ViewModel的数据回流方案
前置说明
以下实现仅依赖Android官方AndroidX原生组件,无任何第三方库引入,符合要求。用到的
viewModelScope、Flow、LiveData均为Android SDK原生提供,新建项目默认自带对应依赖。
方案1:Kotlin协程 + Flow(Kotlin项目首选)
MyRepository实现
class MyRepository { // 挂起函数返回Flow包裹业务数据,此处以String为例,可替换为自定义实体类 suspend fun getData(): Flow<String> = flow { // 原有webservice请求逻辑(耗时操作) val responseData = // 你的webservice请求实现代码 // 发射获取到的原始数据 emit(responseData) }.flowOn(Dispatchers.IO) // 指定耗时操作在IO线程执行 }
MyViewModel实现
class MyViewModel: ViewModel(){ private val repo = MyRepository() init { // ViewModel初始化时发起数据请求 fetchDataFromRepo() } private fun fetchDataFromRepo() { // 用viewModelScope绑定ViewModel生命周期,页面销毁自动取消请求避免内存泄漏 viewModelScope.launch { repo.getData() .catch { e -> // 此处处理请求异常逻辑,比如网络错误、数据解析失败 e.printStackTrace() } .collect { rawData -> // 拿到Repository返回的数据,执行业务操作 processData(rawData) } } } private fun processData(rawData: String) { // 此处写你的自定义业务处理逻辑:比如数据过滤、格式转换、实体映射等 val processedData = rawData.trim() // 处理完成后如果需要通知View层更新,把数据赋值给暴露给View的LiveData/StateFlow即可 } }
方案2:LiveData方案(兼容Java/Kotlin项目)
如果项目未启用Kotlin协程,可使用原生LiveData实现:
MyRepository实现
class MyRepository { fun getData(): LiveData<String> { val resultLiveData = MutableLiveData<String>() // 开子线程执行耗时网络请求 Thread { try { val responseData = // 你的webservice请求实现代码 // 切主线程回传数据 resultLiveData.postValue(responseData) } catch (e: Exception) { // 请求异常时回传错误状态 resultLiveData.postValue(null) } }.start() return resultLiveData } }
MyViewModel实现
class MyViewModel: ViewModel(){ private val repo = MyRepository() // 可选:如果需要给View层暴露数据可直接对外暴露这个LiveData val dataFromRepo = repo.getData() init { fetchDataFromRepo() } private fun fetchDataFromRepo() { dataFromRepo.observeForever { rawData -> rawData?.let { processData(it) } } } private fun processData(rawData: String) { // 此处写你的自定义业务处理逻辑 } override fun onCleared() { super.onCleared() // 如果使用了observeForever,需要在此处移除观察者避免内存泄漏 dataFromRepo.removeObserver(observer) } }
注意事项
- 原有基础代码中存在调用错误:不能直接调用
MyRepository.getData()(静态调用),需要先实例化MyRepository对象再调用实例方法,已在示例代码中修正 - Repository层仅负责数据获取(网络/本地缓存等),不处理业务逻辑,所有业务操作统一放在ViewModel层执行,符合架构分层规范
- viewModelScope会绑定ViewModel生命周期,页面销毁时自动取消未完成的请求,无需手动处理内存泄漏问题
内容的提问来源于stack exchange,提问作者Ahmed Mamdouh
相关产品推荐
相关产品推荐

