当前位置: 首页 > news >正文

[职业竞赛][移动应用]网络请求、JSON 文件读取解析、APP全局变量

网络请求、JSON 文件读取解析

例子代码

// 1. 网络请求 - 用户登录获取token/*** 登录请求数据类(确保JSON格式规范)* @property username 用户名* @property password 密码*/
data class LoginRequest(val username: String, val password: String)/*** 登录响应数据类* @property token 认证令牌*/
data class LoginResponse(val token: String)/*** 认证服务接口*/
interface AuthService {/*** 用户登录接口* @param request 登录请求体(JSON格式)* @return 登录响应(JSON格式)*/@POST("auth/login")@Headers("Content-Type: application/json") // 明确指定请求体为JSONsuspend fun login(@Body request: LoginRequest): LoginResponse
}// 2. Retrofit客户端单例
object RetrofitClient {// 延迟初始化的Retrofit实例private lateinit var retrofit: Retrofit/*** 初始化Retrofit客户端* @param baseUrl API基础地址*/fun initialize(baseUrl: String) {retrofit = Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create()) // JSON转换器.build()}// 认证服务实例val authService: AuthService by lazy {retrofit.create(AuthService::class.java)}// 用户服务实例val userService: UserService by lazy {retrofit.create(UserService::class.java)}
}// 3. 用户数据服务接口
/*** 用户服务接口*/
interface UserService {/*** 获取用户数据* @param token 认证令牌* @return 用户数据(JSON格式)*/@GET("user/data")suspend fun getUserData(@Header("Authorization") token: String): UserData
}/*** 用户数据响应类* @property id 用户ID* @property name 用户名*/
data class UserData(val id: Int, val name: String)// 4. 登录功能封装
/*** 用户登录函数* @param username 用户名* @param password 密码* @return 认证令牌(失败返回null)*/
suspend fun loginUser(username: String, password: String): String? {return try {// 创建登录请求对象(自动转换为JSON)val request = LoginRequest(username, password)val response = RetrofitClient.authService.login(request)response.token} catch (e: Exception) {// 捕获网络异常和JSON解析异常null}
}/*** 获取用户数据* @param token 认证令牌* @return 用户数据对象(失败返回null)*/
suspend fun fetchUserData(token: String): UserData? {return try {// 添加Bearer认证前缀RetrofitClient.userService.getUserData("Bearer $token")} catch (e: Exception) {null}
}// 5. 配置文件读取
/*** 应用配置数据类* @property apiUrl API基础地址* @property enableFeature 功能开关*/
data class AppConfig(val apiUrl: String, val enableFeature: Boolean)/*** 从assets读取配置文件* @param context 上下文对象* @return 配置对象(失败返回null)*/
fun readConfig(context: Context): AppConfig? {return try {context.assets.open("config.json").use { inputStream ->val json = inputStream.bufferedReader().use { it.readText() }Gson().fromJson(json, AppConfig::class.java)}} catch (e: Exception) {null}
}// 6. Activity使用示例
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 读取配置文件val config = readConfig(this) ?: run {Toast.makeText(this, "配置加载失败", Toast.LENGTH_SHORT).show()return}// 初始化Retrofit(使用配置中的API地址)RetrofitClient.initialize(config.apiUrl)// 登录按钮点击事件loginButton.setOnClickListener {lifecycleScope.launch {// 执行登录val token = loginUser("user", "pass")token?.let { validToken ->// 获取用户数据val userData = fetchUserData(validToken)userData?.let {// 主线程更新UIwithContext(Dispatchers.Main) {nameTextView.text = it.name}} ?: showError("用户数据获取失败")} ?: showError("登录失败")}}}private fun showError(msg: String) {runOnUiThread { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() }}
}

依赖项(build.gradle)

dependencies {implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
}

权限(AndroidManifest.xml)

<uses-permission android:name="android.permission.INTERNET"/>

APP全局变量

创建自定义 Application 类

// MyApp.kt
import android.app.Applicationclass MyApp : Application() {// 全局变量示例var globalUserId: String = ""var isLoggedIn: Boolean = falsecompanion object {// 快速访问实例的静态方法@JvmStaticfun getInstance(): MyApp = instance as MyAppprivate lateinit var instance: MyApp}override fun onCreate() {super.onCreate()instance = this}
}

在 AndroidManifest.xml 中注册

<applicationandroid:name=".MyApp"  <!-- 关键:指定自定义 Application -->android:icon="@mipmap/ic_launcher"android:label="@string/app_name"... ><activity android:name=".MainActivity">...</activity>
</application>

在 Activity 中使用全局变量

// MainActivity.kt
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 设置全局变量MyApp.getInstance().globalUserId = "user123"MyApp.getInstance().isLoggedIn = true// 读取全局变量val userId = MyApp.getInstance().globalUserIdval loginStatus = MyApp.getInstance().isLoggedInToast.makeText(this, "User ID: $userId", Toast.LENGTH_SHORT).show()}
}

在其他组件中使用(如 Fragment)

class MyFragment : Fragment() {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {// 访问全局变量val app = (requireActivity().application as MyApp)if (app.isLoggedIn) {// 执行登录用户的操作}}
}

关键点说明

  1. 自定义 Application 类

    • 继承 Application
    • 使用 companion object 提供静态访问点
    • onCreate() 中初始化实例
  2. 线程安全

    • 简单示例未加锁,实际生产环境需考虑同步问题
    • 建议对可变全局变量使用 @Volatile 或同步块
  3. 使用场景

    • 适合存储应用级状态(如用户会话、全局配置)
    • 不适合存储大数据(考虑使用 ViewModel 或持久化存储)
  4. 生命周期

    • Application 实例在应用启动时创建
    • 会持续存在于整个应用生命周期

文章转载自:

http://1Tq9VWvQ.khxyx.cn
http://MbUNxbWb.khxyx.cn
http://lQnAnOWr.khxyx.cn
http://Zaa3uP65.khxyx.cn
http://aInscKmi.khxyx.cn
http://l4F9ZVJX.khxyx.cn
http://SFEfBiMF.khxyx.cn
http://eOTJpzod.khxyx.cn
http://jMl03Q1I.khxyx.cn
http://4fbWoRsc.khxyx.cn
http://iw0jokPO.khxyx.cn
http://7UDWUlcS.khxyx.cn
http://oxDyYIjT.khxyx.cn
http://sBZoK1I7.khxyx.cn
http://BoJv8DMy.khxyx.cn
http://OBkkFe7w.khxyx.cn
http://lGbzuIZp.khxyx.cn
http://uhRJWAxh.khxyx.cn
http://lwffh8xG.khxyx.cn
http://wJFfv87k.khxyx.cn
http://yMz8fyxw.khxyx.cn
http://VaGZRQ6m.khxyx.cn
http://yTpXrDJ7.khxyx.cn
http://66CmbqLi.khxyx.cn
http://Idm4mjdR.khxyx.cn
http://iLr4XbnI.khxyx.cn
http://Xcb63bYW.khxyx.cn
http://ByCabB6r.khxyx.cn
http://wzkC4PaG.khxyx.cn
http://ENcGg5vW.khxyx.cn
http://www.dtcms.com/a/375750.html

相关文章:

  • 2、Python函数设计与字典应用
  • 数据分析与AI丨如何用数据分析找到更优的橡胶配方?
  • Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析
  • 微服务事务管理利器:Seata 核心原理与实践指南
  • ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)
  • 【ARM-day03】
  • TI-92 Plus计算器:单位换算功能介绍
  • TDengine 选择函数 Max() 用户手册
  • 总结 IO、存储、硬盘、文件系统相关常识
  • MATLAB基于GM(灰色模型)与LSTM(长短期记忆网络)的组合预测方法
  • cnn,vit,mamba是如何解决医疗影像问题的
  • 数据库连接池:性能优化的秘密武器
  • 鸿蒙(HarmonyOS) 历史
  • 华为Ai岗机考20250903完整真题
  • 机器人控制器开发(文章总览)
  • 怎么选适合企业的RPA财务机器人?
  • Vite:Next-Gen Frontend Tooling 的高效之道——从原理到实践的性能革命
  • 常用优化器及其区别
  • 【Ansible】管理变量和事实知识点
  • 2025-09-08升级问题记录:app提示“此应用专为旧版Android打造..”或“此应用与最新版 Android 不兼容”
  • 网络通信的“地址”与“门牌”:详解IP地址与端口号的关系
  • 基于Python的旅游数据分析可视化系统【2026最新】
  • Nginx 优化与防盗链全解析:从性能调优到资源保护
  • 【AI】Tensorflow在jupyterlab中运行要注意的问题
  • (论文速读)从语言模型到通用智能体
  • 3-9〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用REST API提权
  • Kafka面试精讲 Day 15:跨数据中心复制与灾备
  • 数据库之间如何同步
  • YOLO学习笔记
  • 3.Python高级数据结构与文本处理