Android组件内核之间组件间通信方案(四)下篇,最新大厂Android校招面试经验汇总

文章介绍了如何在Android应用中使用LiveData的SingleLiveEvent解决生命周期感知问题,以及EventBus的事件发布与订阅机制,强调了UI状态管理和解耦的重要性,讨论了不同线程模式下的事件处理方式。
摘要由CSDN通过智能技术生成

INVALID_URI
}

LiveData 没有提供任何开箱即用的方法,但在 Google 的官方示例中,有一个 SingleLiveEvent 的实现,可以解决这个问题。

一个生命周期感知的被观察者,仅在订阅后发送新的更新,常用于导航和 Snackbar 消息等事件。
这可以避免一些常见问题:在配置变更(如屏幕旋转)期间,如果观察者处于活动动态,SingleLiveEvent 将会发送更新事件。
它继承于 MutableLiveData,是一个被观察者,即使对外暴露了 SingleLiveEvent#setValue()SingleLiveEvent#call() 方法,
注意:只有一个观察者会受到更新通知。

新建一个 SingleLiveEvent 用来向 View 层暴露 Status 数据。
EditProfileViewModel.Kt

private val status = SingleLiveEvent()

fun getStatus(): LiveData {
return status
}

fun handleImage(intent: Intent?) {
intent?.data?.let {
avatar.value = it.toString()
} ?: run { status.value = Status.INVALID_URI }
}

View 只关心 Status 数据,并根据不同的状态或错误执行对应的逻辑。如下实例,我们能很方便地根据每个错误显示不同的 Toast 或 Snackbar。
EditProfileFragment.Kt

viewModel.getStatus().observe(this, Observer { handleStatus(it) })

private fun handleStatus(status: Status?) {
when (status) {
Status.EMPTY_FIRST_NAME -> Toast.makeText(activity, “Please enter your first name!”, Toast.LENGTH_SHORT).show()
Status.EMPTY_LAST_NAME -> Toast.makeText(activity, “Please enter your last name”, Toast.LENGTH_SHORT).show()
Status.EMPTY_CITY -> Toast.makeText(activity, “Please choose your home city”, Toast.LENGTH_SHORT).show()
Status.INVALID_URI -> Toast.makeText(activity, “Unable to load the photo”, Toast.LENGTH_SHORT).show()
Status.SUCCESS -> {
startActivity(HomeFragment.newIntent(activity))
activity.finish()
}
else -> Toast.makeText(activity, “Something went wrong, please try again!”, Toast.LENGTH_SHORT).show()
}
}

State

State – 即 UI 状态,比如加载进度条和 Dialog 等,每次开始订阅 ViewModel 的数据时,ViewModel 应该把这些 UI 状态通知给 View 层。一种简单的做法是,我们可以创建一个数据类来保存这些状态。
EditProfileState.Kt

data class EditProfileState(
var isProgressIndicatorShown: Boolean = false,
var isCityDialogShown: Boolean = false,
var isGenderDialogShown: Boolean = false)

然后在 ViewModel 中创建一个 MutableLiveData,用来包装这个 EditProfileState。由于 ViewModel 只会暴露 LiveData 给 View 层,因此我们应该提供 setter 方法,便于 View 更新此状态。
EditProfileV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值