前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android面试题之Kotlin Jetpack的三大核心组件

Android面试题之Kotlin Jetpack的三大核心组件

作者头像
AntDream
发布2024-06-13 21:03:21
480
发布2024-06-13 21:03:21
举报

ViewModelLiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI 数据。

ViewModel作用

  • 瞬态数据丢失的恢复,比如横竖屏
  • 异步调用的内存泄漏
  • 处理类膨胀提高维护难度和测试难度
  • 使视图和数据能够分离
  • 是介于视图View和数据Model之间的桥梁

LiveData的作用

用于ViewModel数据返回时通知View更新,是ViewModel和View之间的桥梁

那么如何在 Kotlin 中正确优雅地使用 ViewModelLiveData 呢。

1. 添加依赖

首先,需要在 build.gradle 文件中添加相关依赖:

代码语言:javascript
复制
dependencies {
    def lifecycle_version = "2.6.1"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

2. 创建 ViewModel 类

ViewModel 用于存储和管理与 UI 相关的数据,它能在配置变更时继续存在。创建一个继承自 ViewModel 的类:

代码语言:javascript
复制
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {

    // 使用 MutableLiveData 来保存数据
    private val _data = MutableLiveData<String>()

    // 公共的 LiveData 用于暴露数据
    val data: LiveData<String> get() = _data

    // 更新数据的方法
    fun updateData(newData: String) {
        _data.value = newData
    }
}

3. 在 Activity 或 Fragment 中使用 ViewModel

通过 ViewModelProvider 获得 ViewModel 实例,并观察 LiveData

代码语言:javascript
复制
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    // 使用 'by viewModels()' 委托来获取 ViewModel 实例
    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 观察 LiveData
        viewModel.data.observe(this, Observer { newData ->
            // 更新 UI
            textView.text = newData
        })
        
        // 更新数据示例
        button.setOnClickListener {
            viewModel.updateData("New Data")
        }
    }
}

4. 在 Fragment 中使用 ViewModel

如果在 Fragment 中使用 ViewModel,可以使用 viewModelsactivityViewModels

代码语言:javascript
复制
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.fragment_example.*

class ExampleFragment : Fragment(R.layout.fragment_example) {

    // 如果你想让不同的 Fragment 共享同一个 ViewModel 实例
    private val sharedViewModel: MyViewModel by activityViewModels()

    // 如果每个 Fragment 有独立的 ViewModel 实例
    // private val viewModel: MyViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        sharedViewModel.data.observe(viewLifecycleOwner, Observer { newData ->
            // 更新 UI
            textView.text = newData
        })
        
        // 更新数据示例
        button.setOnClickListener {
            sharedViewModel.updateData("New Fragment Data")
        }
    }
}

5. 更新和观察数据

当通过 ViewModel 来更新数据时,观察者会自动收到通知并更新相应的 UI 组件。例如,当调用了 viewModel.updateData("New Data")MainActivity 中的 textView 会自动显示新数据,因为它在观察 LiveData

Lifecycle

Jetpack 组件中的 Lifecycle 是一个用于管理和观察 Android 组件(如 ActivityFragment)生命周期的库。

Lifecycle的作用
  • 帮助开发者建立可感知生命周期的组件
  • 组件在其内部管理自己的生命周期,从而降低模块耦合度
  • 降低内存泄漏发生的可能性
  • Activity、Fragment、Service、Application都有Lifecycle支持
ProcessLifecycleOwner监听应用程序生命周期
  • 是针对整个应用程序的监听,与Activity的数量无关
  • Lifecycle.Event.ON_CREATE 与 Lifecycle.Event.ON_DESTROY,前者只会被调用一次,后者永远不会被调用
使用场景

平时像上面例子中和LiveData、ViewModel一起使用的比较多

总结

通过 ViewModelLiveData,可以实现数据的生命周期感知,并且在配置变更(如设备旋转)时也能保持 UI 的状态。此外,这种模式使得数据和 UI 的逻辑更为清晰、解耦、易于维护。同时结合Lifecycle,通过结构化和简化生命周期管理,使得生命周期感知组件在 Android 开发中更为高效,也有助于减少潜在的内存泄漏和其他生命周期相关的问题。

码字不易,求转发,求点在看,求关注,感谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ViewModel作用
  • LiveData的作用
  • 1. 添加依赖
  • 2. 创建 ViewModel 类
  • 3. 在 Activity 或 Fragment 中使用 ViewModel
  • 4. 在 Fragment 中使用 ViewModel
  • 5. 更新和观察数据
  • Lifecycle
    • Lifecycle的作用
      • ProcessLifecycleOwner监听应用程序生命周期
        • 使用场景
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档