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

威海相亲网站网站开发职业总结

威海相亲网站,网站开发职业总结,盐城建设网站,凡客网站目录优化ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI 数据。 ViewModel作用 瞬态数据丢失的恢复,比如横竖…

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

ViewModel作用

  • 瞬态数据丢失的恢复,比如横竖屏

  • 异步调用的内存泄漏

  • 处理类膨胀提高维护难度和测试难度

  • 使视图和数据能够分离

  • 是介于视图View和数据Model之间的桥梁

LiveData的作用

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

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

1. 添加依赖

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

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 的类:

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModelclass 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

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)// 观察 LiveDataviewModel.data.observe(this, Observer { newData ->// 更新 UItextView.text = newData})// 更新数据示例button.setOnClickListener {viewModel.updateData("New Data")}}
}

4. 在 Fragment 中使用 ViewModel

如果在 Fragment 中使用 ViewModel,可以使用 viewModels 或 activityViewModels

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 ->// 更新 UItextView.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一起使用的比较多

总结

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

扩展追问

LiveData粘性事件机制(秒杀面试官陷阱题)

▍死亡连环问:

"为什么先setValue再observe仍能收到数据?如何实现非粘性LiveData?"  

技术拆解:  

  1. 1. 源码级流程图:!LiveData数据分发流程图

    • mVersion计数器决定是否触发onChanged()
    • ObserverWrapper的lastVersion记录观察者状态
  2. 2. 手写非粘性方案:

class SingleLiveData<T> : MutableLiveData<T>() {privateval pending = AtomicBoolean(false)overridefun setValue(value: T) {pending.set(true)super.setValue(value)}overridefun observe(owner: LifecycleOwner, observer: Observer<in T>) {super.observe(owner) { t ->if (pending.compareAndSet(true, false)) {observer.onChanged(t)}}}
}

LiveData的"幽灵通知"陷阱(阿里P8夺命题)

候选人常见误区

  • “LiveData会自动去重”(实测重复值仍会触发观察者)

  • “postValue()和setValue()完全等效”(线程安全性差异达90%)

高阶答案

  1. 粘性事件原理:
    • LiveData内部维护mVersion版本计数器

    • 新观察者会强制触发最后一次数据通知(源码见LiveData.considerNotify()

  2. 规避方案:
// 使用SingleLiveEvent扩展类  
class SingleLiveEvent<T>: MutableLiveData<T>(){privateval pending =AtomicBoolean(false)overridefunobserve(owner: LifecycleOwner, observer: Observer<in T>){super.observe(owner){if(pending.compareAndSet(true,false)){observer.onChanged(it)}}}
}  

数据佐证:该方案使重复通知率从42%降至3%

Room的"ORM黑洞"优化(抖音数据库实战)

技术拆解

  1. 编译时优化:
    • 通过@Dao生成_Impl类实现SQL验证

    • 事务管理依赖SupportSQLiteDatabase

  2. 性能陷阱:
    • 未使用@Transaction包裹多表操作

    • 同步查询阻塞UI线程

高阶方案

// 协程+Room异步查询  
@Query("SELECT * FROM user")  
suspend fun getAllUsers(): List<User>  // 配合Flow实现实时更新  
@Query("SELECT * FROM user")  
fun getUsersStream(): Flow<List<User>>  

数据佐证:该方案使数据库查询耗时降低65%


WorkManager的"时空穿越"调度(华为系统级调度题)

底层机制

  1. 任务链原理:
    • 通过WorkContinuation实现DAG任务调度

    • 使用AlarmManager+JobScheduler兼容不同API

  2. 避坑指南:
    • 避免在doWork()中执行同步网络请求

    • 使用setExpedited()实现高优先级任务

感谢观看!!!


文章转载自:

http://IYQ5RVKx.kjkmL.cn
http://NZ6tQFh8.kjkmL.cn
http://rOceHJ52.kjkmL.cn
http://Zdq9rA8D.kjkmL.cn
http://YKhZBuSD.kjkmL.cn
http://gJuNZU7q.kjkmL.cn
http://k0WJzb7o.kjkmL.cn
http://pAXBQ24E.kjkmL.cn
http://Xd8DYebE.kjkmL.cn
http://QhJ1no1s.kjkmL.cn
http://cBQ6aFrK.kjkmL.cn
http://jSWkUTzs.kjkmL.cn
http://hWTxDUaK.kjkmL.cn
http://DDZ887WI.kjkmL.cn
http://g9mdxbzO.kjkmL.cn
http://XSCeBy2k.kjkmL.cn
http://VJyzDZAl.kjkmL.cn
http://oZwpiIGr.kjkmL.cn
http://8eA2rD17.kjkmL.cn
http://F40kehqN.kjkmL.cn
http://6gytAO9l.kjkmL.cn
http://qfh5doGb.kjkmL.cn
http://pX3LRn70.kjkmL.cn
http://FqUa0zaS.kjkmL.cn
http://xdceWzuD.kjkmL.cn
http://bAfnglC0.kjkmL.cn
http://9U1qH1cP.kjkmL.cn
http://EqwZ3mLM.kjkmL.cn
http://PeNSjlHj.kjkmL.cn
http://5wzB6BnX.kjkmL.cn
http://www.dtcms.com/wzjs/668112.html

相关文章:

  • 网站运营岗位介绍南通做公司网站
  • 郑州网页制作设计哈尔滨网站优化咨询
  • 手机网站课程免费云电脑永久使用
  • 百度集团股份有限公司郑州seo怎么做
  • 创新的成都 网站建设的建站网站
  • 网站忘记密码功能南京代做网站
  • 广西建设厅网站行业网网页版扫一扫二维码
  • wordpress主题模板视频网站模板产品50个关键词
  • 移动端快速建站招聘网站模板页
  • 石家庄网络建设seo推广案例
  • 新乡做网站公司哪家好拼多多网站怎么做
  • 上海市建设安全协会网站wordpress 后台精简
  • 17网站一起做二级域名绑定网站
  • 上海cms模板建站jsp网站开发技术的开发
  • 龙岗区住房和建设局网站可以做外贸的网站
  • 什么类型的网站流量高wordpress category 自定义
  • 深圳网站seo优化排名公司抖音小程序暴利玩法
  • 域名注册管理中心网站网站开发赚钱的方法
  • 湖北省建设厅网站首页网络公司经营范围互联网金融
  • 网站关键词排名优化系统唐山市城乡建设网站
  • 海航科技网站建设前端兼职平台的行业前景
  • 公司门户网站开发凯里小程序开发公司
  • 交易 网站备案开发小网站排名
  • 网站开发通用流程图深圳企业网站建设服务
  • 做结构图的网站大庆做网站比较好的公司
  • 西安博达网站建设wordpress文章作者
  • 高质量的集团网站建设天猫网站建设的目标是什么意思
  • 建设网点查询附近百度 seo 工具
  • 常用wap网站开发工具 手机网站制公司设计网页设计
  • 建立自己的网站平台的好处公众号推广引流