Android MVVM最佳实践(Lifecycles&Retrofit)

当结合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.GET

interface MyApiService {

    @GET("data")
    fun fetchData(): Call<MyData>
}

4. 创建Repository管理数据获取

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

import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class 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.HttpException

class MyViewModel(private val repository: MyRepository) : ViewModel() {

    private val _data = MutableLiveData<MyData>()
    val data: LiveData<MyData> = _data
    private val _error = MutableLiveData<String>()
    val error: LiveData<String> = _error

    fun 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.GsonConverterFactory

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel
    private lateinit var lifecycleObserver: MyLifecycleObserver
    private lateinit var apiService: MyApiService

    override 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和LifecycleObserver
        viewModel = 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的生命周期事件发生时执行特定的操作,实现了业务逻辑与生命周期的解耦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬_小彬

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值