首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

安卓开发中的Model-View-Presenter(MVP模式)

确实,一段时间内,一个非常基础的MVP已经被提出来打破 God-Object (完全负责所有的事情),而且,就在不久之前,谷歌提出的MVVM,使用它的体系结构组件,正在被采用(ViewModel, LiveData...对于层之间的通信,经典的MVP案例中,我们发现它是通过回调完成的(这将最终把我们的应用程序变成回调地狱),而在MVVM LiveData中使用,虽然它允许我们避免回调,但它没有为我们提供大量的操作符来操作数据...View Android中,我们的视图的实现将对应于一个活动或一个片段(示例/项目中是片段),但它可以是一个ViewModel,甚至是一个可视化组件。...这里不讨论视图是由N个片段组成的活动的情况,因为每个片段都有M个演示者,我们可以假设视图是这些片段中的每一个,尽管它们随后被分组到一个片段中(甚至另一个片段中)。...改进 有许多事情可以改进,例如: ViewModel: 可以视图和表示器之间添加一个额外的层,表示器负责保存视图的状态。

1.6K30

协程中的取消和异常 | 驻留任务详解

如果您需要执行一个能够应用进程之外活跃的操作 (比如向远程服务器发送日志), Android 平台上建议使用 WorkManager。...您可以进行单元测试或仪器测试时轻松替换掉它们。 2. 应当在 ViewModel 或 Presenter 层创建协程 如果是仅与 UI 相关的操作,则可以 UI 层执行。...不会如您预期般工作,这是因为 withContext 中使用上下文时,异常会被重新抛出。...而且,我个人不喜欢 ViewModel 或 Presenter 层之下与 Android lifecycle 建立关系,我希望这些层级是平台无关的。 建议: 不要直接使用它。...建议: 仅用它来挂起清理操作相关的代码。 每当您需要执行一些超出当前作用域范围的工作时,我们都建议您在您自己的 Application 类中创建一个自定义作用域,并在此作用域中执行协程。

1.4K20

Android Jetpack - ViewModel

和 UI 控制器之间的通信 3、 UI 控制器中使ViewModel 1、创建 ViewModel 创建 MainActivityViewModel 并继承 ViewModel class MainActivityViewModel...: ViewModel(){} 以上面的计时器为例,我们需要 UI 保持持续更新时间的状态,所以 ViewModel 添加一个 startTime 变量用于存储不断累计的时间 class MainActivityViewModel...UI 控制器中使ViewModel 我们计时开始之前先将系统当前时间存入 viewModel.startTime 变量,而后每次 onCreate 被调用时,都会先取出 viewModel.startTime...ViewModel 结合 LiveData ViewModel 如果不结合 LiveData 来用的话就失去了它的灵魂,正如人与人之间的默契配合才能发挥出整个团队的潜能,架构组件本着开放灵活的原则,允许你单独集成使用它们其中的任何一个...ViewModel 中初始化 Timer 我们直接在初始化模块启动 Timer,让它每秒执行一次 timerTask 并在 timerTask 内部更新 elapsedTime 的值为当前时间距离 startTime

83420

Jetpack Compose中MVVM的实现及ViewModel和remember对比

数据共享: ViewModel: ViewModel 通常用于存储与界面相关的持久性数据,它可以多个组件之间共享,比如在同一个 Activity 中的不同 Fragment 之间共享数据。...remember: remember 主要用于存储临时性的局部状态,例如 UI 状态、临时缓存等,它的作用范围通常限制用它的组件内部。...用法: ViewModel: 通常通过 Activity 或 Fragment 中使用 ViewModelProvider 获取 ViewModel 实例,并在需要时观察 ViewModel 中的 LiveData...这意味着 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。...SideEffect 中的回调函数只 MyList 组件第一次创建时被调用,因为 SideEffect 会在组件创建时运行其代码块,并在每次组件重新组合时运行。

56210

面试中Vue被问的最多的题目是哪些?

MVVM 架构下,View 和 Model 之间并没有直接的联系,而是通过 ViewModel 进行交互,Model 和 ViewModel 之间的交互是双向的, 因此 View 数据的变化会同步到...实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我们需要在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套。...哪种功能场景使用它? vue 框架中状态管理。 main.js 引入 store,注入。新建了一个目录 store,….. export 。场景有:单页应用中,组件之间的状态。..._withCommit(fn) 设置_committing 标志变量为 true,然后才能修改 state,修改完毕还需要还原_committing 变量。...描述使用它实现登录功能的流程 axios 是请求后台资源的模块。 npm i axios -S 如果发送的是跨域请求,需配置文件中 config/index.js 进行配置

1.5K20

【译】LiveData三连

Scenario 为了用代码片段进行演示,我们想象一下,构建一个社交网络应用中的界面UI,它显示了一个用户的简介以及该用户的关注者数量。...后来,当你需要处理数据并在此基础上改变UI时,你会发现继续活动中写代码,这样会更容易,因为它已经包含了所有需要更新的字段和UI元素。让我们来看看代码会是什么样子。...在我看来,事件总线机制是有道理的,但你应该注意在哪些情况下使用它。例如,应用程序交叉事件的情况下,事件的源头和事件中的角色之间没有明确的关系。...下面是一些例子,说明Kotlin中使用高阶函数可以避免多少模板。...我们已经简要介绍了在哪些用例中使用LiveData是不合理的,甚至可能对你的功能和可扩展性造成一些限制。根据事物的用途来使用它们会更容易,让你最大限度地发挥它们提供的优势。

1.6K20

Flow 操作符 shareIn 和 stateIn 使用须知

您可以 StateFlow 文档 中查看更多相关信息。 两者之间的最主要区别,在于 StateFlow 接口允许您通过读取 value 属性同步访问其最后发出的值。...当上游数据流的创建成本很高,或者 ViewModel 中使用这些操作符时,这一技巧尤其有用。 缓冲事件 在下面的例子中,我们的需求有所改变。...如果您只允许一个用户,并且收集者需要更新为观察新的用户,您可以向一个所有收集者共用的 SharedFlow 或 StateFlow 发送事件更新,并将公共数据流作为类中的变量。...shareIn 与 stateIn 操作符可以与冷流一同使用来提升性能,您可以使用它没有收集者时添加缓冲,或者直接将其作为缓存机制使用。...小心使用它们,不要在每次函数调用时都创建新的数据流实例——这样会导致资源的浪费及预料之外的问题!

4.6K20

Google 推荐 MVVM 架构中使用 Kotlin Flow

那么 Flow 为我们解决了什么问题,我主要从以下几个方面思考: LiveData 是一个生命周期感知组件,最好在 View 和 ViewModel中使用它,如果在 Repositories 或者...DataSource 中使用会有几个问题 它不支持线程切换,其次不支持背压,也就是一段时间内发送数据的速度 > 接受数据的速度,LiveData 无法正确的处理这些请求 使用 LiveData 的最大问题是所有数据转换都将在主线程上完成...ViewModel,接下来我们来看一下如何在 ViewModel 中接受 Flow 发送的数据。...Kotlin Flow ViewModel 中的使用 ViewModel 中使用 Flow 之前 Jetpack 成员 Paging3 实践以及源码分析(一) 文章也有提到, 这里我们深入分析一下..., ViewModel 中接受 Flow 发送的数据有三种方法,根据实际情况去调用。

4.1K20

ViewModels and LiveData- Patterns + AntiPatterns

视图应该只知道如何显示数据并将用户事件发送ViewModel(或Presenter)。这就是所谓的被动视图模式。...❌ 避免ViewModels中对View进行引用。 ViewModels和View之间进行通信的推荐方式是观察者模式,使用LiveData或来自其他库的观察变量方式。...ViewModel配置变化时被持久化,所以当重新请求发生时,不需要重新查询外部数据源(如数据库或网络)。 当长期运行的操作结束时,ViewModel中的观察变量会被更新。数据是否被观察并不重要。...Leaking ViewModels 反应式范式Android中运行良好,因为它允许UI和你的应用程序的其他层之间建立一个方便的连接。...使用LiveData存储库和ViewModel之间进行通信,其方式类似于View和ViewModel之间使用LiveData。 这点用Flow也可以解决。

1.1K30

Android Jetpack | DataBinding

DataBinding 是属于 Jetpack 的一个支持库,可以让你以布局中声明属性的方式替代编码方式将布局中的 UI 组件和应用数据进行绑定 通常我们让控件和数据交互的方式如下面的代码,调用 findViewById... 标签就是我们放布局变量的地方,布局变量用于编写布局表达式,布局表达式被放置元素的属性值中,格式是@{布局表达式} 3、实现你的第一个布局表达式 标签中添加一个 String...类型的布局变量 TextView 控件的属性中使用此变量,注意 id 和 variable...= viewModel } } 运行 app 看看效果 DataBinding 还可以和 LiveData 完美结合,我们可以看到 MainViewModel 中的 name 变量是 LiveData...R.color.popular) Popularity.STAR -> ContextCompat.getColor(context, R.color.star) } } 现在,我们可以直接在布局属性中使用它

1K10

LiveData beyond the ViewModel

通过LiveData,这种通信更加安全:由于它的生命周期意识,数据只有View处于Activity状态时才会被接收。 简而言之,其优点是你不需要在View和ViewModel之间手动取消订阅。...img LiveData beyond the ViewModel 可观察范式视图控制器和ViewModel之间工作得非常好,所以你可以用它来观察你的应用程序的其他组件,并利用生命周期意识的优势。...如果在一个典型的应用程序的每一层中使用LiveData,看起来就像这样。 img 为了组件之间传递数据,我们需要一种方法来映射和组合数据。...然而,我们正在泄露所有以前的LiveDatas,这些LiveDatas不会再发送更新,所以这是一种浪费。 你可以存储一个对源的引用,然后添加新的源之前将其删除。...不要在var中使用Livedata。初始化的时候,要将转换的内容写入。

1.5K30

iOS开发之ReactiveCocoa下的MVVM

写上篇文章时也知道有ReactiveCocoa这个函数响应式编程的框架,并且有许多人用它来更好的实现MVVM。...使用ReactiveCocoa可以方便的MVVM各层之间架起沟通的管道,便于每层之间的交互。现在在我们做的工程中已经使用ReactiveCocoa框架了,用起来的感觉是非常爽的,好用!...通过Switch我们可以控制那个信号起作用,并且可以信号之间进行切换。也可以这么理解,把Switch看成另一段水管,Switch对接那个水管,就流那个水管的水,这样比喻应该更为贴切一些。...MVVM中引入RactiveCocoa 学以致用,最后来个简单的实例,来感受一下如何在MVVM中使用RactiveCocoa。当然今天RAC的应用是非常简单的,但原理就是这样的。...重点在于如何在MVVM各层之间使用RAC的信号来更方便的各个层之间进行响应式数据交互。下面这个实例的UI是非常简单的,并且实现起来也是灰常简单的,关键还是在于RAC的应用。

1.3K60

《GraphQL 名词 101:解析 GraphQL 的查询语法》【译】

但是GraphQL操作中三种可选的部分都没有在上述栗子中使用。如果你不仅仅是用GraphQL执行查询操作,或是希望传递动态变量到GraphQL查询中,你就需要利用到这些新的GraphQL特性。...变量定义(Variable definitions):当客户端向GraphQL服务器发送查询时,会存在查询文档不变,当某些字段会动态变化的情况。这些就是查询中的变量。...在你的操作(operations)中使片段(fragments ) 片段(fragments )只有操作(operations)中使用才能发挥出作用。...接下来我们将介绍使用片段(fragments )的两种方式: fragments 片段扩展运算符(Fragment spread): 当你操作或者其他片段中使片段时,你可以将片段名置于...之后来表示片段...`skip` 指令表示 if 参数为 true 时忽略片段中的字段。由于指令的语法相当灵活,我们可以利用它来给GraphQL添加更多的特性,而不是使用语法解析或者引入更复杂的工具的方式。

2.8K20

实战 | 使用 Kotlin Flow 构建数据流 管道

我们使用数据流构建器来创建数据流,因为 Flow 是协程上下文环境中运行的,它以挂起代码块作为参数,这也意味着它能够调用挂起函数,我们可以代码块中使用 while(true)来循环执行我们的逻辑。...userMessages.collect { messages -> listAdapter.submitList(messages) } Flow 中使用终端运算符将按需创建数据流并开始发送值...您还可以 ViewModel 中使用 androidx.lifecycle:lifecycle-livedata-ktx 包里的 Flow.asLiveData(): LiveData 将数据流转换为...,并在离开目标状态时取消内部的生产者: lifecycleScope.launch { viewModel.userMessages .flowWithLifecycle(lifecycle...我们需要某种缓冲区机制来保障无论重新收集多少次都可以保持数据,并在多个收集器之间共享数据,而 StateFlow 正是为了此用途而设计的。

1.4K10

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券