Android MVVM最佳实践(LifecyclesRetrofit)

当结合MVVM架构、Lifecycle以及网络请求时,通常会使用Retrofit库来进行网络请求操作。以下是如何在Android应用中整合Retrofit进行网络请求,并与MVVM架构和Lifecycle结合的示例:

1. 添加依赖项

确保在项目的build.gradle文件中添加Retrofit和其相关依赖:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson转换器,用于将JSON转换为对象
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' // 可选:日志拦截器,用于查看网络请求的日志

2. 创建数据模型

定义一个数据模型类,用于描述从网络请求返回的数据结构。

data class MyData(val id: Int,val name: String,val description: String
)

3. 创建网络请求接口

使用Retrofit创建一个接口,用于定义网络请求的方法。

import retrofit2.Call
import retrofit2.http.GETinterface MyApiService {@GET("data")fun fetchData(): Call<MyData>
}

4. 创建Repository管理数据获取

创建一个Repository类,负责管理数据的获取,可以在这里调用Retrofit进行网络请求。

import retrofit2.Call
import retrofit2.Callback
import retrofit2.Responseclass MyRepository(private val apiService: MyApiService) {fun fetchDataFromApi(callback: (Result<MyData>) -> Unit) {val call: Call<MyData> = apiService.fetchData()call.enqueue(object : Callback<MyData> {override fun onResponse(call: Call<MyData>, response: Response<MyData>) {if (response.isSuccessful) {callback(Result.success(response.body()))} else {callback(Result.failure(Exception("Failed to fetch data")))}}override fun onFailure(call: Call<MyData>, t: Throwable) {callback(Result.failure(t))}})}
}

5. 创建ViewModel管理UI相关数据

在ViewModel中使用Repository来管理数据获取,并使用LiveData来管理UI相关的数据状态。

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import retrofit2.HttpExceptionclass MyViewModel(private val repository: MyRepository) : ViewModel() {private val _data = MutableLiveData<MyData>()val data: LiveData<MyData> = _dataprivate val _error = MutableLiveData<String>()val error: LiveData<String> = _errorfun fetchData() {viewModelScope.launch(Dispatchers.IO) {try {repository.fetchDataFromApi { result ->result.onSuccess { fetchedData ->_data.postValue(fetchedData)}result.onFailure { exception ->_error.postValue(exception.message)}}} catch (e: HttpException) {_error.postValue("HttpException: ${e.message}")} catch (e: Exception) {_error.postValue("Error: ${e.message}")}}}
}

6. 在Activity中使用ViewModel和LifecycleObserver

在Activity中实例化ViewModel,并将LifecycleObserver绑定到Activity的Lifecycle上。同时,通过ViewModel的LiveData观察数据的变化,更新UI状态。

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryclass MyActivity : AppCompatActivity() {private lateinit var viewModel: MyViewModelprivate lateinit var lifecycleObserver: MyLifecycleObserverprivate lateinit var apiService: MyApiServiceoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_my)// 创建Retrofit实例val retrofit = Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).build()// 创建API服务接口apiService = retrofit.create(MyApiService::class.java)// 实例化ViewModel和LifecycleObserverviewModel = ViewModelProvider(this, MyViewModelFactory(MyRepository(apiService))).get(MyViewModel::class.java)lifecycleObserver = MyLifecycleObserver()// 将LifecycleObserver绑定到Activity的Lifecycle上lifecycle.addObserver(lifecycleObserver)// 观察LiveData数据变化viewModel.data.observe(this, Observer { newData ->// 更新UI,例如更新TextView的内容textView.text = "ID: ${newData.id}, Name: ${newData.name}, Description: ${newData.description}"})// 观察错误信息viewModel.error.observe(this, Observer { error ->// 处理错误,例如显示Toast或其他UI反馈showToast(error)})// 当需要获取数据时,调用ViewModel中的方法viewModel.fetchData()}private fun showToast(message: String) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}
}

7. 清理操作

在Activity生命周期结束时,确保取消LifecycleObserver的观察,以避免内存泄漏和资源浪费。

override fun onDestroy() {super.onDestroy()lifecycle.removeObserver(lifecycleObserver)
}

通过以上步骤,我们整合了Retrofit进行网络请求,同时使用了MVVM架构和Lifecycle来管理数据获取和UI更新。Repository负责数据获取的具体实现,ViewModel负责管理UI相关的数据状态,并通过LiveData实时更新UI,而LifecycleObserver则负责在Activity的生命周期事件发生时执行特定的操作,实现了业务逻辑与生命周期的解耦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发环境搭建:步入C++编程世界的基石

在探索C++这一强大而灵活的编程语言时,搭建一个高效、舒适的开发环境是每位初学者的首要任务。开发环境不仅影响着编程的效率,还直接关系到编程体验和学习效果。本文将详细阐述如何为C++编程搭建一个全面的开发环境,从选择合适的IDE(集成开发环境)、配置编译器,到管理项目…

2024大家都想掌握的4种PDF翻译技巧

借着互联网的东风现在全球化的交流越发频繁&#xff0c;很多时候都会遇到跨语言交流的问题。外语不好的小伙伴阅读外国文献的时候应该都很头疼吧&#xff0c;这时候pdf翻译成中文的工具就可以解决这个问题啦。 1.福昕翻译 直通车&#xff1a;https://fanyi.pdf365.cn/ 这个…

@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400

项目里发生了一个bug&#xff0c;就是前端请求一个接口时候&#xff0c;报了HTTP 400 Bad Request 通常来说这个问题是前后端的参数没对齐&#xff0c;比如前端传了个String&#xff0c;但后端对应的是Integer。 所以我就排查了半天&#xff0c;结果没发现啥错误&#xff0c;…

PSINS工具箱函数介绍——insplot

insplot是一个绘图命令,用于将avp数据绘制出来 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导基于PSINS的相关程序设计(付费专题)使用方法 此函数使用起来也很简单,直接后面加avp即可,如: insplot(avp);其中,avp为: 每行表示一个时间1~3列为姿态…

量化交易策略解读

光大证券-20190606-重构情绪体系&#xff0c;探知市场温度——市场情绪体系系列报告之二.pdf 市场情绪与股市择时体系研究 市场情绪的重要性 市场情绪反映了投资者心理状态的集体体现&#xff0c;对市场走势有同步或滞后的影响&#xff0c;并在某些情况下预示市场转折点。 择…

一键解锁:科研服务器性能匹配秘籍,选择性能精准匹配科研任务和计算需求的服务器

一键解锁&#xff1a;科研服务器性能匹配秘籍 HPC科研工作站服务器集群细分领域迷途小书童 专注于HPC科研服务器细分领域kyfwq001 &#x1f3af;在当今科技飞速发展的时代&#xff0c;科研工作对计算资源的需求日益增长&#x1f61c;。选择性能精准匹配科研任务和计算需求的服…

力扣39题:组合总和的 Java 实现

引言 力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;提供了大量的编程题目供开发者练习。第39题“组合总和”是一个经典的回溯算法问题&#xff0c;要求找出所有可能的组合&#xff0c;使得组合中的数字之和等于给定的目标值。本文将介绍如何使用 Java …

集合的面试题和五种集合的详细讲解

20240724 一、面试题节选二、来自于b站人人都是程序员的视频截图 &#xff08;感谢人人都是程序员大佬的视频&#xff0c;针对于个人复习。&#xff09; 一、面试题节选 二、来自于b站人人都是程序员的视频截图 hashmap&#xff1a; 唯一的缺点&#xff0c;无序&#xf…

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换 文章目录 昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换CycleGAN模型模型结构循环一致损失函数 数据集数据下载创建数据集 网络构建生成器判别器损失函数和优化器前向计算梯度计算与反向传播 总结打卡 CycleGAN模…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换&#xff0c;做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如&#xff0c;在两页PPT中&#xff0c;使用同一个形状对象&#xff0c;修改了大小和颜色。 选择切换为平滑后&#xff0c;可以完成如下的动画显示。 …

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…

数学基础 -- 分段函数的导数

分段函数的导数 分段函数的导数是指分段函数在每一段上的导数情况&#xff0c;以及在分段点上的导数情况。具体可以通过以下步骤进行计算&#xff1a; 确定分段函数的定义&#xff1a;首先明确分段函数的每一段的表达式和对应的区间。 逐段求导&#xff1a;在每个区间内&…

【TortoiseGit】合并单个commit(提交)到指定分支上

0、前言 当我们用Git的时候经常用到多个分支&#xff0c;会经常有如下情况&#xff1a;一个dev分支下面会有多个test分支&#xff0c;而每个test分支由不同的开发者。而我们会有这样的需求&#xff1a; 当某个test分支完成了相应功能验证&#xff0c;就要把成功验证的功能代码…

智能卡芯片载带条带AOI外观检测设备及系统

智能卡及其芯片载带简介 我国智能卡产业的发展始于1993年的“金卡工程”&#xff0c;它是一项把货币电子化&#xff0c;运用芯片技术来搭载电子货币应用&#xff0c;运用互联网技术建立从发行到受理的电子货币系统&#xff0c;以提高社会运作效率&#xff0c;方便人们工作生活为…

多角度解析高防CDN防御DDOS及CC攻击

网络攻击的形式也日益多样化&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;Challenge Collapsar&#xff09;攻击尤为突出&#xff0c;给网站和企业带来了巨大的安全威胁。高防CDN&#xff08;Content Delivery Network&#xff09;作为一种专业…

Mac m1安装 MongoDB 7.0.12

一、下载MongoDB MongoDB 社区版官网下载 二、安装配置MongoDB 1.解压下载的压缩包文件&#xff0c;文件夹重命名为mongodb; 2.将重命名为mongodb的文件夹&#xff0c;放在/usr/local 目录下 3.在/usr/local/mongodb 目录下&#xff0c;新建data 和 log这两个文件夹&#…

09-optee内核-线程处理

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】TEE从入门到精通-[目录] 👈👈👈线程处理 OP-TEE内核使用几个线程来支持在 并行(未完全启用!有用于不同目的的处理程序。在thread.c中,您将找到一个名为…

Flutter开发Dart 中的 mixin、extends 和 implements

目录 ​​​​​​​前言 1.extends 2.implements 3.mixin 前言 在 Dart 中&#xff0c;mixin、extends 和 implements 是面向对象编程中常用的关键字&#xff0c;它们分别用于不同的继承和实现方式。理解它们的用法和区别对于编写高质量、可维护的 Dart 代码至关重要。本文…

使用内网穿透工具 frp 发布内网 web 站点

使用内网穿透工具 frp 发布内网 web 站点 文章目录 使用内网穿透工具 frp 发布内网 web 站点一、基础环境二、适用场景三、过程和方法四、参考资料 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2024年7月20日首…