LiveData 是一种可观察的数据持有者类,它可以在数据变化时通知观察者。LiveData 适用于 Android 开发,特别适合与 ViewModel 结合使用,以实现数据与 UI 的生命周期绑定。
Repository 是一种设计模式,用于将数据操作逻辑与 UI 层分离。它负责从数据源(如数据库、网络服务等)获取数据,并提供给 ViewModel 使用。
ViewModel 是一种 Android 架构组件,用于管理 UI 相关的数据,并处理与 UI 无关的业务逻辑。ViewModel 的生命周期与 Activity 或 Fragment 不同,它可以在配置更改(如屏幕旋转)时保持数据。
以下是用 LiveData 和 Repository 设置 ViewModel 的正确方法:
class MyRepository(private val apiService: ApiService) {
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> get() = _data
fun fetchData() {
apiService.getData().enqueue(object : Callback<MyData> {
override fun onResponse(call: Call<MyData>, response: Response<MyData>) {
if (response.isSuccessful) {
_data.postValue(response.body())
}
}
override fun onFailure(call: Call<MyData>, t: Throwable) {
// Handle failure
}
})
}
}
class MyViewModel(private val repository: MyRepository) : ViewModel() {
val data: LiveData<MyData> = repository.data
fun fetchData() {
repository.fetchData()
}
}
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
val apiService = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
val repository = MyRepository(apiService)
viewModel = ViewModelProvider(this, object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MyViewModel(repository) as T
}
}).get(MyViewModel::class.java)
viewModel.data.observe(this, Observer { myData ->
// Update UI with myData
})
viewModel.fetchData()
}
}
适用于需要从网络或数据库获取数据并在 UI 上显示的场景,特别是在需要处理配置更改(如屏幕旋转)的应用中。
setValue
或 postValue
方法使用不当。setValue
,在后台线程上调用 postValue
。通过以上方法,可以有效地使用 LiveData 和 Repository 设置 ViewModel,实现数据与 UI 的解耦和生命周期管理。
领取专属 10元无门槛券
手把手带您无忧上云