Android MVVM企业级应用架构搭建封装(Databing双向绑定)

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

1. MVVM的3大根本布局介绍

MVVM是Model-View-ViewModel的简写。
了解MVVM+data binding的开发模式。所以学习之前一定要先学习Data Binding!

至于MVVM根本上和MVP如出一辙,感觉只是名字替换了一下。
MVVM架构的关键概念是数据绑定(Data Binding)。
通过数据绑定,ViewModel可以将数据直接绑定到View上,使得View能够自动更新,而且保持与ViewModel的同步。
MVVM在MVP的基础上加入了双向绑定,使View能够感知ViewModel中的数据变化,ViewModel能够感知View数据的变化
MVVM布局二
MVVM:内里的ViewModel不是jetpack内里的ViewModel
Model:处理惩罚数据的,比如网络请求

总结分析:
1).View层: 是展示数据的,以及吸收到用户的操纵传递给viewModel层,通过dataBinding实现数据与view的单向绑定或双向绑定
2).Model层: 最重要的作用就是获取数据了,当然不止于此,model层将结果通过接口的形式传递给viewModel层,和MVP的Mode是一样的。
3).ViewModel 层通过调用model层获取数据,以及业务逻辑的处理惩罚。viewModel 和MVP中的presenter 的作用类似 ,只不外是通过 databinding 将数据与ui举行了绑定。
个人理解VM在取到Model层的数据后,应该是通过LiveData的post大概set方法来关照View层有数据更新, 一个vm对于一个view,
viewMode l内里封装livedata, 如果有多个bean那么livedada岂不是有多个, 是的
4). VM和View层是要解耦的。怎么解耦的? 通过Databing.
MVVM的架构表格:


2. MVVM的实战案例

问题: MVVM+ViewModel+LiveData+DataBind如何利用?

大型项目实战:
1) View层: 传入<ViewModel,Databing >,把databing绑定viewmode,然后通过ViewModel去请求数据,然后再拿到ViewModel的引用,举行数据观察,observe

  1. class UpLoadFragment(layoutId: Int) :
  2.    TransferBaseFragment<UploadViewModel, FragmentUploadBinding>(layoutId) {
  3.    private lateinit var mAdapter: UploadAdapter
  4.    override fun loadDate() {
  5.        mViewModel.dataList.observe(this) {
  6.            setNoFileLayoutVisible(it.isNullOrEmpty())
  7.            mAdapter.updateData(it)
  8.        }
  9.        println("getTemporarySk:getData")
  10.        mViewModel.getData()
  11.    }
  12.    fun initRecyclerView() {
  13.        mAdapter = context?.let {
  14.            UploadAdapter(it)
  15.        }!!
  16.        binding.transferRecyclerView.adapter = mAdapter
  17.    
  18.    }
  19. }
复制代码
2).ViewModel:内里数据用muableLiveData,得到Model的数据,然后PostView,发送出去,然后VIew那里就可以通过观察者吸收

  1. class UploadViewModel : AppBaseViewModel() {
  2.     var dataList = MutableLiveData<MutableList<UploadTask>>()
  3.     fun getData() {
  4.         dataList.postValue(adapterData())
  5.     }
  6.     /***
  7.      * 从上传器中获取任务
  8.      */
  9.     open fun adapterData(): MutableList<UploadTask> {
  10.         val itemList = mutableListOf<UploadTask>()
  11.         BNLog.d("UploadAndDownViewModel", "" + uploadingTask.size)
  12.         return itemList
  13.     }
  14. }
复制代码
基类:实现了LifecycleObserver接口
  1. open class AppBaseViewModel(
  2.     val app: Application = CloudServiceApp.getInstance()
  3. ) : AndroidViewModel(app), LifecycleObserver {
复制代码
3).model:网络请求,没有独立开,都放在了ViewMode层,可以举行优化!
案例二:
1). 界说Model

  1. data class Weather(val city: String, val temperature: String)
  2. class WeatherRepository {
  3.    fun getWeather(city: String): Weather {
  4.        // 从网络或其他数据源获取天气数据
  5.        return Weather(city, "25°C")
  6.    }
  7. }
复制代码
2). 界说View:

  1. class WeatherActivity : AppCompatActivity() {
  2.     private lateinit var viewModel: WeatherViewModel
  3.     override fun onCreate(savedInstanceState: Bundle?) {
  4.         super.onCreate(savedInstanceState)
  5.         setContentView(R.layout.activity_weather)
  6.         viewModel = ViewModelProvider(this).get(WeatherViewModel::class.java)
  7.         viewModel.weather.observe(this, { weather ->
  8.             updateUI(weather)
  9.         })
  10.         val cityButton = findViewById<Button>(R.id.cityButton)
  11.         cityButton.setOnClickListener {
  12.             // 用户点击城市按钮时触发切换城市的操作
  13.             val selectedCity = // 通过弹出对话框或其他方式获取用户选择的城市
  14.             viewModel.fetchWeather(selectedCity)
  15.         }
  16.     }
复制代码
3). 界说ViewModel:

  1. class WeatherViewModel : ViewModel() {
  2.     private val weatherRepository = WeatherRepository()
  3.     private val _weather = MutableLiveData<Weather>()
  4.     val weather: LiveData<Weather> = _weather
  5.     fun fetchWeather(city: String) {
  6.         val weatherData = weatherRepository.getWeather(city)
  7.         _weather.value = weatherData
  8.     }
  9. }
复制代码
以上示例中,我们通过界说Model、View和ViewModel三个部分来实现MVVM架构。
ViewModel负责从Model层获取天气数据,并通过LiveData观察的观察者, 将数据更新到View层。
View层通过观察LiveData的变化来更新UI,并通过ViewModel实行相应的业务逻辑。
问题: 如何更新UI的?
1). ViewModel----------------->LiveData---------------->View

ViewModel负责从Model层获取天气数据,并通过LiveData观察的观察者, 将数据更新到View层。

问题: view变化是如何关照到Model层的?
2). View-------------------->ViewModel------------------->Model(View变化了input值, 导致ViewModel数据(model)变化了)

利用
1). 利用databanding, view内里包罗了viewModel (绑定View层的组件到ViewModel层的数据)
2). viewModel内里封装了liveData
3). 利用的时候 , 数据变化, 通过LiveData将数据更新到View层
View层有输入的变化, 会到颠末ViewModel, android:text="@{viewModel.userOutput), ViewModel会实行对应的业务逻辑!
画一个完备的图! :

3. MVVM 如何实现双向绑定的?

有人说MVVM核心是双向绑定,没有利用Databinding的项目都是假的MVVM。 也就是:MVVM == 双向绑定,双向绑定 == Databinding, MVVM == Databinding。
通过Android提供的数据双向绑定库data binding 将Acitvity/xml视图层与ViewModel绑定。在xml布局文件中,通过@{}来表示单向绑定大概@={}来表示双向绑定
3.1) 什么是双向绑定:

双向数据绑定则是MVVM模式中的一个重要特性,它允许数据在Model和View之间自动同步,淘汰了手动设置和监听数据变化的代码量。
重点通过中间: ViewMode
ViewModel的第2层意思: 数据共享!

Model与View之间通过ViewMode关联,ViewModel负责将Model数据的变化显示到View上,通过将View的改变反馈到Model上这就是我们常说的双向绑定命据机制。
3.2 ) 问题: 双向绑定具体是怎么实现的?

则允许数据的双向同步更新,即当Model中的数据改变时,View自动更新;当用户在View中修改数据时,Model也会相应更新。通过解耦数据和界面逻辑,
4. MVVM架构与MVP架构的对比

1).颠末数据双向绑定之后,我们不在需要想MVP中写那么多接口回调方法区实现视图层和业务层的交互。业务层也不再持有视图层的引用。
数据绑定:MVVM通过数据绑定实现了View和ViewModel的自动同步,而MVP需要通过Presenter手动更新View。

  • .代码量: (简洁 )MVP架构通常需要编写更多的代码,因为Presenter需要显式地处理惩罚UI更新。MVVM通过数据绑定淘汰了冗余的UI更新代码。 3) .可测试性:由于ViewModel与View之间的解耦,MVVM架构更易于编写单元测试。而在MVP架构中,Presenter需要模拟View的举动,测试相对复杂。
  • .学习曲线:MVVM引入了数据绑定等新概念,相对而言学习曲线较陡。而MVP相对较简单,更轻易理解和上手。
数据驱动UI
在利用MVC或MVP开发时,我们如果要更新UI,起首需要找到这个view的引用,然后赋予值,才能举行更新。
在MVVM中,这就不需要了。MVVM是通过数据驱动UI的,这些都是自动完成
4.2 MVVM的优缺点:

优点总结:

1).颠末数据双向绑定之后,我们不在需要想MVP中写那么多接口回调方法区实现视图层和业务层的交互。业务层也不再持有视图层的引用。
2). View有ViewModel的引用,但是ViewModel没有任何关于View的信息。
3).View和Model的双向绑定是支持生命周期检测的,不会担心页面销毁了尚有回调发生,这个由lifeCycle完成。
缺点:

1).MVVM:编译时,但是对内存要求有点高

  • .数据绑定方式使得bug难以确定是在View中还是在Model中。
通过这种方式举行数据双向绑定后,xml中会多出一些标签、表达式、甚至和业务有点的简单盘算代码。这倒霉于业务的逻辑的查看。而且由于双向绑定是data binding实现的。在这个过程中, 如果出现bug导致数据没有被感知改变,不方便排错,因为xml不能debug调试。

  • .ViewModel持有Model的依赖。.view和viewmodel都绑定了一起???
5. MVVM问题思索

MVVM不消databing也叫MVVM??????????
5.1 问题MVVM:如果不消databing可以吗?

宝能封装的就是,通过livedatabus实现的。
当然可以,这样view和ViewModel就没有绑定关系,可以用kotlin内里的bind。
5.2. 问题viewModel的更新怎么会改变model?

我们利用Google提供的DataBinding技术来完成数据绑定,以实现View和ViewModel层的交互。
末了

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。别的,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的操持都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶条记》,帮大家将紊乱、零散、碎片化的知识举行体系化的整理,让大家体系而高效地掌握Android开发的各个知识点。

相对于我们平常看的碎片化内容,这份条记的知识点更体系化,更轻易理解和影象,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末尚有ChatGPT机器人小福利哦,大家万万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上大概是技术上的问题


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表