安卓开发中复杂自定义数据类(多层集合)初始化示例(kotlin语言)

定义了一个名为returnRowRecord的数据类,包含三个属性:一个布尔值varret,默认为false;一个可变的String列表vardataStringArray,初始化为空;一个可变的ByteArray列表vardataBOLBArray,也初始化为空。然后创建了returnRowRecord的一个实例,从MySQLite数据库操作中返回。

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

自定义数据类
data class returnRowRecord(var ret: Boolean=false, var dataStringArray: MutableList<String>, var dataBOLBArray:MutableList <ByteArray>)
var theNowRecord=MySQLite.returnRowRecord(false, mutableListOf(), mutableListOf(byteArrayOf()))
<think>我们使用OkHttp3和Retrofit在Android中实现一个GET异步请求,不依赖ViewModel和DataBinding。我们将使用回调的方式(而不是协程)来实现异步,因为用户要求不要使用ViewModel,并且协程方式在之前的回答中已经给出。所以这里我们使用Retrofit的enqueue回调方式。步骤:1.添加依赖2.创建数据模型类3.定义API接口(使用@Query注解添加参数)4.创建Retrofit实例和ApiService实例5.在Fragment中发起请求并使用回调处理结果注意:我们直接在Fragment中更新UI,不使用ViewModel。引用说明:对于错误处理,我们可以参考引用[4]中封装异常的方法,这里我们简单处理错误,显示错误信息。另外,引用[2]介绍了OkHttp的拦截器链,我们可以添加日志拦截器来调试。根据用户要求,不使用协程,所以我们用回调方式。代码示例:</think> ### Android Kotlin:OkHttp + Retrofit GET带参数异步请求示例(无ViewModel/DataBinding) 以下是完整实现方案,使用回调方式实现异步请求,不依赖ViewModel或DataBinding: #### 1. 添加依赖(build.gradle) ```gradle dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' } ``` #### 2. 数据模型 ```kotlin // API响应模型 data class ApiResponse( @SerializedName("data") val data: UserData, // 实际数据结构 @SerializedName("errorCode") val errorCode: Int, @SerializedName("errorMsg") val errorMsg: String ) data class UserData( val id: Int, val name: String, val email: String ) ``` #### 3. API接口定义 ```kotlin interface ApiService { // GET请求带参数(使用@Query) @GET("users/profile") fun getUserProfile( @Query("userId") userId: Int, @Query("token") token: String ): Call<ApiResponse> } ``` #### 4. Retrofit工具类 ```kotlin object RetrofitClient { private const val BASE_URL = "https://api.example.com/" private val client: OkHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) .build() val apiService: ApiService by lazy { Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) } } ``` #### 5. Fragment中实现异步请求 ```kotlin class UserFragment : Fragment() { // 视图绑定 private lateinit var btnFetch: Button private lateinit var tvName: TextView private lateinit var progressBar: ProgressBar override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 初始化视图(传统findViewById方式) btnFetch = view.findViewById(R.id.btn_fetch) tvName = view.findViewById(R.id.tv_name) progressBar = view.findViewById(R.id.progress_bar) // 设置点击监听 btnFetch.setOnClickListener { fetchUserData(userId = 12345, token = "user_auth_token") } } private fun fetchUserData(userId: Int, token: String) { progressBar.visibility = View.VISIBLE RetrofitClient.apiService.getUserProfile(userId, token).enqueue( object : Callback<ApiResponse> { override fun onResponse( call: Call<ApiResponse>, response: Response<ApiResponse> ) { progressBar.visibility = View.GONE if (response.isSuccessful) { val apiResponse = response.body() if (apiResponse?.errorCode == 0) { // 成功获取数据 apiResponse.data?.let { user -> updateUserUI(user) } } else { // API返回的业务错误 handleError("Error ${apiResponse?.errorCode}: ${apiResponse?.errorMsg}") } } else { // HTTP错误处理 handleError("HTTP error: ${response.code()}") } } override fun onFailure(call: Call<ApiResponse>, t: Throwable) { progressBar.visibility = View.GONE handleError("Network error: ${t.localizedMessage}") } } ) } private fun updateUserUI(user: UserData) { tvName.text = "Name: ${user.name}" // 其他UI更新 } private fun handleError(message: String) { Toast.makeText( requireContext(), message, Toast.LENGTH_SHORT ).show() // 显示在TextView中(可选) tvName.text = "Error: $message" } } ``` #### 关键特性说明: 1. **纯回调异步**:使用Retrofit的`enqueue()`实现异步请求[^2] 2. **生命周期安全**:请求会自动与Activity/Fragment绑定 3. **错误处理**: - HTTP错误码(非200) - 网络连接错误 - API业务错误(errorCode非0)[^4] 4. **参数传递**: - 使用`@Query`注解添加GET参数 - 支持多参数请求 5. **UI更新**: - 直接操作UI元素(如TextView) - 进度条显示/隐藏 - Toast错误提示 #### 工作流程: ```mermaid graph TD A[按钮点击] --> B[显示进度条] B --> C[发起GET请求] C --> D{请求成功?} D -->|是| E[解析响应数据] D -->|否| F[处理错误] E --> G{errorCode=0?} G -->|是| H[更新UI] G -->|否| I[显示业务错误] H --> J[隐藏进度条] I --> J F --> J ``` #### 相关布局示例(res/layout/fragment_user.xml): ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/btn_fetch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取用户信息"/> <ProgressBar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:textSize="18sp"/> </LinearLayout> ``` #### 常见问题优化: 1. **避免内存泄漏**: ```kotlin override fun onDestroyView() { // 取消所有待处理请求 RetrofitClient.cancelAllRequests() super.onDestroyView() } ``` 2. **参数特殊字符处理**: ```kotlin @GET("users/profile") fun getUserProfile( @Query("userId", encoded = true) userId: Int, @Query("auth_token", encoded = true) token: String ): Call<ApiResponse> ``` 3. **动态Header添加**: ```kotlin private val client = OkHttpClient.Builder() .addInterceptor { chain -> val request = chain.request().newBuilder() .addHeader("Authorization", "Bearer $token") .build() chain.proceed(request) } .build() ``` #### 替代方案比较: | **方法** | **优点** | **缺点** | |----------------|--------------------------|-------------------------| | Callback回调 | 简单直接,无需额外依赖 | 多层嵌套时易形成回调地狱 | | RxJava | 强大的链式调用/错误处理 | 增加额外依赖和学习曲线 | | Kotlin协程 | 代码简洁,结构化并发 | 需要lifecycleScope支持 | 该方案完全符合要求:不使用ViewModel或DataBinding,通过OkHttp/Retrofit实现GET异步请求[^2]。 ### 相关问题 1. 如何取消正在进行的网络请求? 2. 当屏幕旋转时如何避免重复请求? 3. 如何为所有请求统一添加认证头信息? 4. Retrofit如何处理GET请求中的数组参数? 5. 如何进行网络请求的超时设置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值