首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 架构组件最新进展 (上篇)

或者直接在 XML 中设置一个变量,并在视图中访问,代码也能马上给出对应提示。这些都即时可用,无需编译! ? ?...更好地支持重构 IDE 里使用重构方式修改函数名称之后,XML 中会同步进行更新。 ? 更好用报错信息 数据绑定出错信息可能一下子跳出来 1,000 条,这种尴尬将成为过去。...现在在构建输出信息窗口中,数据绑定错误单独成组,这样开发者能更轻松地找到自己需要处理错误信息。 ? 有没有更好视图访问方式? ?...视图访问方法当然不止一种,但正如上图所示简明、编译安全和编译速度上,各个方法总有取舍。那有没有一种方法能一石 "三" 鸟呢? 即将到来!...Jetpack 代码库,现已发布了 2.1 稳定版,与此同时下一个版本也已经出现在了不远前方,接下来我们会: 导航中提供成组 (Scoped) ViewModel,比如一套登录流程界面集合就可以用一个

90240

Android Jetpack - ViewModel

ViewModel 简述 ViewModel 旨在以生命周期感知形式存储和管理 UI 控制器(Activity/Fragment 等)相关数据,可以解决 UI 控制器中数据无法正确保留以及数据在其复杂生命周期中难以维护痛点...而我们传统处理办法就是配置变更期间保留对象和自行处理配置变更这两种,这两种方式都有很多坑(看看官方文档就知道了),尤其是需要恢复数据比较多时候,而 ViewModel 就非常适合处理这些情况 在下图中...: ViewModel(){} 以上面的计时器为例,我们需要 UI 保持持续更新时间状态,所以 ViewModel 添加一个 startTime 变量用于存储不断累计时间 class MainActivityViewModel...UI 控制器中使用 ViewModel 我们计时开始之前先将系统当前时间存入 viewModel.startTime 变量,而后每次 onCreate 被调用时,都会先取出 viewModel.startTime...秒数,此处 elapsedTime 为 LiveData 类型,它会随着 ViewModel 初始化开始通过 Timer 自动更新,下一步我们只需要在 Activity 中订阅它即可实时更新数据

83820
您找到你想要的搜索结果了吗?
是的
没有找到

Android基于DataBinding+Koin实现MVVM模式页面快速开发框架

>() { } 2.4 事件处理 前面界面加载完成了,数据也可以 ViewModel 中进行更新,常规事件也可以 ViewModel 中进行处理,但是跟 Context 相关处理 ViewModel...中是没办法进行处理,因为 ViewModel 中没办法拿到 Context 实例,比如 toast 提示、弹框、页面跳转等,这些情况怎么处理呢?...ViewModel 实现 MVVM 模式开发中,一般是通过 DataBinding 将布局与 ViewModel 绑定使用,ViewModel数据变化自动刷新界面,实现数据驱动 UI 刷新...// 具体业务实现中实际布局 xml 文件中声明当前视图 ViewModel 变量为 vm 即可自动进行绑定。...createViewModel 方法进行初始化 initDataBinding将 viewModel 与布局 vm变量进行绑定。

1.5K20

一文了解MVI架构,学起来吧~

集中管理State MVVM样式代码中,以网络请求功能为例,UI状态分为正在加载、加载成功与加载失败,为了监听UI状态,我们会在Viewmodel中定义变量监听,代码如下所示:   /***      ...,所以我们要定义一个私有的不可变MutableSharedFlow用于Viewmodel赋值,再对外暴露一个不可变用于UI层监听。...,怎么样,有没有瞬间回到MVP时代View中提前定义好各种接口感觉。...,上面这种方式也没有什么缺陷,单项数据流模式中,Activity向ViewModel发送Intent事件,从而ViewModel集中处理用户操作。...此时这部分业务逻辑是没办法直接写在A或BRespository中,但又是一个重复业务逻辑,所以我们抽取出一个网域层,用于接收A、B层数据,将数据处理后返回给UI层。

1.2K30

Architecture Components ViewModel控制。

); 代码很好理解,获取当前类ViewModel提供者,之后传入需要获得ViewModel类型。...,看看有没有已经创建HoldFragment,只不过还没有添加上去。...HoldFragment关联到Activity/Fragment之后会在缓存中去掉当前Activity/Fragment对应HoldFragment HoldFragmentonDestory时候会调用其成员变量...简单看一下,代码不难理解,先赋值成员变量,之后是查看ViewModelStore中是否有传入类型ViewModel,没有的话就通过传入工厂类创建一个新ViewModel 添加到ViewModelStore...然后HoldFragment中持有一个集合用于保存当前宿主ViewModelonDestory函数中调用集合clear方法,间接调用到ViewModelonCleared方法,实现生命周期控制

79290

RxSwift + MJRefresh 打造自动处理刷新控件状态

使用RxSwift开发时会大量使用到这种形式,其中就包括我们网络请求。...结合 iOS - RxSwift 项目实战记录 中所述“MJRefreshRxSwift中使用”,output中定义了一个变量 let refreshStatus = Variable<LXFRefreshStatus...接下来才是本文重点。 重点 刷新状态无非也就那么几种,下拉重载数据,上拉加载更多,请求完成时结束下拉或上拉等等。。。那我们何必要在每个controller中再去管理这等琐事??...而至此,刷新控件状态是由变量 refreshStatus 来决定,此时 refreshStatus 又声明 OutputRefreshProtocol 协议中,我们何不再定义一个方法,将刷新控件状态交给...中根据实际情况实时更新 refreshStatus 刷新状态 image.png 案例 协议:Refreshable.swift ViewModel:LXFLiveViewModel Controller

1.8K41

MVC、MVP、MVVM三剑客

,更新UI通过数据绑定实现,尽量ViewModel里面做(更新绑定数据源即可),Activity要做事就是初始化一些控件(如控件颜色,添加RecyclerView分割线),View层可以提供更新...ViewModel ViewModel只做和业务逻辑和业务数据相关事,不做任何和UI相关事情,ViewModel 层不会持有任何控件引用,更不会在ViewModel中通过UI控件引用去做更新UI...ViewModel层处理事件时候只需要关心处理数据就行了。...重点来了 MVVM编译方式和其他模式不同,它是实时编译,所以我经常遇到一些莫名奇妙问题。...2、控件上没有值,控件没有值看你数据有没有问题或者数据有没有传递进去 目前遇到也就是这些问题。

1.1K111

开源 | 如何写一个好用 JetPack Compose 状态页组件

因为 compose 是声明式编程思想,即我们可以理解为数据驱动,所以最简单做法: 定义一个变量,然后每次更改这个变量变量改变之后,相应使用这个变量地方就会触发重组,于是我们可以随手写出下面的伪代码...这是一个展示用户点赞排行榜列表页,按照我们常规思路,我们会怎么写: 先展示loading 请求数据 请求成功-设置数据,错误-显示缺省页 这个思路没有问题,传统 view 中我们一般都是这样实现,...中缓存时,可以使用这个方法便于对state做初始化相关 * 这样好处就是可以将唯一初始化东西放在这个 [block] 回调中,而不用担心重复初始化 * @param composeState 要记住状态...viewModel 中定义了一个当前状态,并且定义了加载数据方法, Ui部分,我们使用了一个 rememberState 这个方法缓存当前 state 状态,在这里方法中我们还可以初始化 state...部分回调,并且启用了加载数据,这将触发 onRefresh 回调,即加载页面数据,从而调用了我们 ViewModel 内部 getData() 方法,当数据加载完成,我们便可以直接驱动这个 state

78620

开源 | 如何写一个好用 JetPack Compose 状态页组件

因为 compose 是声明式编程思想,即我们可以理解为数据驱动,所以最简单做法: 定义一个变量,然后每次更改这个变量变量改变之后,相应使用这个变量地方就会触发重组,于是我们可以随手写出下面的伪代码...这是一个展示用户点赞排行榜列表页,按照我们常规思路,我们会怎么写: 先展示loading 请求数据 请求成功-设置数据,错误-显示缺省页 这个思路没有问题,传统 view 中我们一般都是这样实现,...中缓存时,可以使用这个方法便于对state做初始化相关 * 这样好处就是可以将唯一初始化东西放在这个 [block] 回调中,而不用担心重复初始化 * @param composeState 要记住状态...viewModel 中定义了一个当前状态,并且定义了加载数据方法, Ui部分,我们使用了一个 rememberState 这个方法缓存当前 state 状态,在这里方法中我们还可以初始化 state...部分回调,并且启用了加载数据,这将触发 onRefresh 回调,即加载页面数据,从而调用了我们 ViewModel 内部 getData() 方法,当数据加载完成,我们便可以直接驱动这个 state

1K10

实时音视频开发学习3 - 实现web端跑通知识储备

如果一时点快了,可以实时音视频>应用管理>应用信息>快速上手中查阅SECRETKEY。...文件用于生成签名 Js-->develop:主要存放业务逻辑代码,其中common为开发过程中公共函数和全局变量,index为入口函数,presetting为初始化代码,rtc-client为登录客户对象...作为参数 作为返回值 demo中用于将登陆信息作为callback函数参数暴露出外面。...客户端对象创建完之后便开始进入房间和本地初始化,其流程如下: 首先根据房间id进入房间,并设置登录标志为“已登录状态”,接着从麦克风和摄像头采集本地音视频流,并初始化initialize本地音视频。...房间内业务逻辑 打开或者关闭摄像头: 设置全局变量isCamOn,默认为true,当点击摄像头时将视频网格中video-btn属性src修改关闭状态,同时将成员列表中对应member-video-btn

1.5K20

由浅入深,详解ViewModel那些事

ViewModel存在之前世界 ViewModel 出现之前,对于 View 逻辑与数据,我们往往都是直接存在 Activity 或者 Fragment 中,优雅一点,会细分到具体单独类中去承载...相应,我们数据没有额外处理情况下,往往也会被初始化,然后界面重启时重新加载。 但如果当前页面需要维护某些状态不被丢失呢,比如 选择、上传状态 等等? 此时问题就变得棘手起来。...所以,现在开发中,我们开始将 View数据 与 逻辑 藏于 ViewModel 中,然后对外部暴漏观察者,比如我们常常会搭配 LiveData 一起使用,以此更容易保持状态同步。...我们 MainViewModel 构造函数中新增了一个参数 state:SavedStateHandle ,这个参数 ViewModel 初始化时,会帮我们自动进行注入。...并在其 createHandle() 内将我们传入 bundle 转为 Map 形式,从而传入 SavedStateHandle 构造函数中用初始化

76040

如何利用状态同步开发一款联机游戏

实际应用中有多种用法:把实时服务器当成仲裁,计算最终游戏结果;当玩家掉线时可用实时服务器来执行一些特殊逻辑,如使用机器人托管掉线玩家操作;实时服务器还可以实现将玩家数据保存在开发者腾讯云/云开发数据库上...玩家首页通过三种匹配方式(1V1、2V2、3V3)进入房间,玩家向实时服务器发送准备指令后会进入答题页,选择答案后提交到实时服务器,由实时服务器逻辑判断答案正误,并且下发新游戏状态给每个玩家客户端...(2)onInitGameData 初始化游戏数据:游戏数据房间生命周期一致,随房间销毁而销毁,可认为是对战式游戏数据。 触发时机为第一次收到玩家消息之前会调用一次。...• SDK 参数是实时服务器提供一些方法: (1)sendData 给房间内玩家发送数据,发送配置包括超时时间和最大重试次数。 (2)dispatchActio 模拟玩家发消息给实时服务器。...(3)clearAction 串行模式下,有些消息会被放置队列里,调用该方法可以清空这个队列,所有没有被处理消息都会被清空。

3.8K20

Kotlin 和 JetPack 项目实战(一)

MutableLiveData 只能将完整数据作为值覆盖旧数据才会通知观察者,也就是说利用 getValue() 方法对旧数据进行微小修改也没办法触发通知。...= loading) { _showLoadingView.value = loading } } /* 基本上就是初始化页面需要请求数据时候...() , 而他父类 LiveData setValue() 是个 protected 方法 ,可以对外隐藏赋值操作,一定程度上让数据操作完全局限 ViewModel 中。...{ return null } } 几个 kotlin 语法我啰嗦几句,var lateinit 只能说是提示编译器,这个变量不要因为没有初始化就给我报错,我会在使用前择期初始化...let方法是前值非空就执⾏代码简写 getModel() 返回 BaseViewModel 子类 Class,而因为 ViewModel 初始化特殊性,他是由 Fragemnt 或者 Activity

97310

Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?

State 状态:官方文档上说 State 状态是指可以随时间变化任何值。例如,它可能是存储 Room 数据库中值、类变量,加速度计的当前读数等。怎么理解这个概念呢?... Compose 文档中,ViewModel 被推荐为 State状态管理对象,从而实现将数据与界面展示 Activity 分离解耦目的。...,而且 Activity、Fragment 重建时 ViewModel数据是不受影响。...根据官方推荐,得先有一个 ViewModel 进行状态数据管理: // code 2 class ZhuViewModel: ViewModel() { // 状态数据初始化初始化为空字符串...此外,为了保证每次重组时 State 状态不会被初始化为初值,Compose 引入 remember 关键字来将数据存储相应 Composable 组件中。

2K30

如何避免写出高耦合低内聚前端代码?

当我需要重用这个组件时,根本没办法用,只能重构。 当封装组件时候,应该是组件接口(e.g. props)中暴露组件需要外部数据,而非在组件里面或者组件子组件里面依赖外部数据导致过高耦合。...vue开发过程中, MVVM 设计模式下,如果模块化做得不够细,会让 viewModel 变得非常复杂,变得复杂同时无法复用或者移植。...对于这个项目来说,因为使用了 pinia 作为状态管理,并且需求需要在某些场景下用户通过url参数进入,所以可以在业务逻辑中统一使用 pinia 读取状态.路由管理中用vue-router 路由守卫...[1] 路由 初始化/切换时 获取需要路由参数并写入 pinia 状态管理中....建议手动引入一下,全局变量非常不友好(不熟悉项目的人找不到依赖,没有提示,没办法点击跳转等)。

8910

掌握 Jetpack Compose 中 State,看这篇就够了

State值可以是任意类型:如像Boolean或者String一样简单基础类型,也可以是一个包含整个渲染到屏幕上 UI 状态复杂数据类型。...by 是 Kotlin 中用于代理关键字。它将mutableStateOf()返回 MutableState实例类型藏了起来,让我们能像操作boolean类型变量一样使用enabled变量。...虽然我们能够去修改enabled变量,但 UI 无法感知到这个变化,也就无法enabled变换时候自动更新。如果不使用remember {}?...使用mutableStateOf()ViewModel中创建表示状态MutableState实例,ViewModel内更新 UI 状态,UI 界面能通过这个暴露出来状态进行 UI 刷新。...可组合函数中,我们可以用viewModel {}函数,这个函数负责 Compose 进行重组过程中保证每次返回都是同一个同一个ViewModel实例。

7.4K111

【C语言期末不挂科——指针初阶篇】

实际上:   计算机运行时,数据会存放在内存中,内存会以 字节 为单位划分为多个存储空间,并且为每个字节默认设置一个对应编号,这个编号就是地址。   ...2、64位机器上,有64个地址线,一个指针变量大小就是8个字节了。 3)指针变量   还记不记得我们在学C语言中用 ‘&’ 符号?是不是很眼熟?...,上个房客剩下东西统统清理干净,随后将你东西放进角落…[结束]   指针意义就是为了来管理我们内存,C语言中用指针来访问内存有一个专门运算符:*(解引用运算符) ,这里解引用,就可以对指针指向内存空间随意访问啦...其实,这里没有对指针p进行初始化,他没有保存任何变量地址。这个指针也是一个局部变量,当局部变量初始化时候,内容是随机值。   ...2、已经回收资源地址,再次访问这个地址就是非法访问。 2)如何避免野指针   由上面的学习我们知道指针玩不好代价是很大,那么有没有什么办法防止指针越界等问题呢?

7510

闭包是个好东西,巧用闭包实现数据绑定

今天我要给大家介绍是另一种方式,那就是使用闭包来实现数据绑定。 闭包为何物 闭包是自包含函数代码块,可以代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量或变量引用。...首先,为了能让 ViewModel 和 View 之间能形成绑定,我们需要提供一种简单机制让 ViewModel数据源与 View 中控件绑定在一起。...本次演示中,我拿了之前一个项目代码做参考,此项目也是我之前写一篇文章 “iOS 优雅处理网络数据,你真的会吗?...不如看看这篇” 调研写代码。 简单描述一下需求:我们需要将在 ViewModel 中通过网络异步获取到图片数据并返回给主视图里 TableView, 并将数据加载出来。...将 ViewModel 中需要对外数据代码由 private var images: [ImageModel] = [] 改为: var images: Box =

47110

阅兵式太震撼了,深圳腾讯云沙龙又为个人开发者带来怎样惊喜?

开发者无需关注底层网络架构、网络通信、服务器扩缩容、运维等,即可获得就近接入、低延迟、实时扩容高性能联机对战服务,让玩家在网络上互通、对战、自由畅玩。...MGOBE 适用于回合制、策略类、实时会话(休闲对战、MOBA、FPS)等游戏。 二、联机对战引擎快速上手 废话少说,我们还是直接上代码,就知道有多么爽了。 1....初始化监听 使用API之前还需要到腾讯云上开通 MGOBE 使用权限,拿到 gameId、secretKey、url 等信息,然后就可能使用代码初始化联机对战引擎,代码如下: const gameInfo...(room); } else { console.log("初始化失败"); } }); //调用房间匹配 API const playerInfo = { name...针对不同游戏场景进行深度优化,覆盖休闲社交、MOBA、MMORPG、FPS 等多种游戏类型;支持多人实时语音、3D位置语音、语音消息和语音转文本等功能;功能完备,接入门槛低,一个 SDK 即可满足多样化游戏语音需求

1.5K20
领券