jetpack compose 开发架构选择探讨(一),2024年最新android面试binder机制

Content1(count = count,

{ navController.navigate(“screen2”) }

) {

viewModel.add(1)

}

}

我们可以看到借助于viewModel()方法我们可以在jetpack compose中很方便快捷的创建viewModel,同时也可以将livedata方便的转换为compose state,当state发生变化时,界面就会自动重组并显示,比原有安卓view体系使用起来方便很多。

MVI

MVI架构大多数人可能不是很了解,不过其实也不是很难,它把mvvm的双向绑定变成单向数据流,强调数据的单向流动和数据源唯一性,state不可变,view通过state渲染数据,viewmodel通过action改变state 在这里插入图片描述

Content代码和MVVM一样

ViewModel代码如下

class MVIViewModel : ViewModel() {

val viewState = MutableLiveData(ViewState())

val userIntent = Channel(Channel.UNLIMITED)

init {

handleAction()

}

private fun add(num: Int) {

viewState.value?.let {

viewState.postValue(it.copy(count = it.count + 1))

}

}

private fun reduce(num: Int) {

viewState.value?.let {

viewState.postValue(it.copy(count = it.count - 1))

}

}

private fun handleAction() {

viewModelScope.launch {

userIntent.consumeAsFlow().collect {

when (it) {

is UiAction.AddAction -> add(it.num)

is UiAction.ReduceAction -> reduce(it.num)

}

}

}

}

data class ViewState(val count: Int = 1)

sealed class UiAction {

class AddAction(val num: Int) : UiAction()

class ReduceAction(val num: Int) : UiAction()

}

}

Screen代码如下

@Composable

fun Screen1(

navController: NavController

) {

val viewModel: MVIViewModel = viewModel(navController = navController)

val viewState by viewModel.viewState.observeAsState(MVIViewModel.ViewState())

val coroutine = rememberCoroutineScope()

Content1(count = viewState.count,

{ navController.navigate(“screen2”) }

) {

coroutine.launch {

viewModel.userIntent.send(MVIViewModel.UiAction.AddAction(1))

}

}

}

通过上诉代码我们应该可以体会出mvvm和mvi之间的区别

多page通信问题

对于一个应用来说,通常不可能只会有一个page,由于mvvm和mvi的viewmodel都是和page绑定的,对于多个page来说,要想实现跨page通信可能比较麻烦,这也是目前mvvm和mvi的一个大问题。不过这个问题也很好解决,我们可以定义一个方法可以获取其他page的viewmodel或者全局的viewmodel即可。不过在compose中该如何实现,首先我们要了解compose中的viewmodel是如何保存的

通常compose都是和navigation来实现page跳转的,对于上面的viewModel()方法,我们分析源码可以发现,每跳转一个新的page,它都会新建一个新的ViewModelStoreOwner(即NavBackStackEntry),所以如果我们不指定ViewModelStoreOwner的话我们是获取不到上一个page和全局的viewmodel的,因此我们可以提供一个创建viewModel的方法,在创建时候先去获取当前路由栈和全局中存在的viewModel,获取不到的话再新建或者抛一个异常出去,这样就可以在page中获取到其他page的viewModel,实现page间的通信了 代码也非常简单,如下

@Suppress(“MissingJvmstatic”)

@Composable

inline fun viewModelOfNav(

navController: NavController,

key: String? = null,

factory: ViewModelProvider.Factory? = null

): VM {

val javaClass = VM::class.java

var viewModelStoreOwner: ViewModelStoreOwner? = null

navController.backQueue.forEach {

if (it.existViewModel(javaClass, key = key)) {

viewModelStoreOwner = it

return@forEach

}

}

if (viewModelStoreOwner == null) {

val context = LocalContext.current

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

结语

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是目录截图:

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
)]

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

[外链图片转存中…(img-p4qNOBSa-1712738131554)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-cW0negOY-1712738131554)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值