在 Android 中实现 Redux 的一点经验

Redux 与 MVI:Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中,有两种流行的选择是 Redux 和 MVI(Model-View-Intent)。两者都有各自的优缺点,因此在深入研究之前了解它们的区别至关重要。本指南将深入探讨 Redux 和 MVI 的核心原则,突出它们在 Android 开发中的关键区别。此外,我将提供一些有用的资源链接,这些资源提供了更深入的见解和实用的实现示例。 Action Creator 函数 Reducer 函数 Store 创建与初始化 使用示例 MV 阅读详情

简评: Redux 是一个用于应用程序状态管理的开源JavaScript库,其核心是通过可管理和控制的状态来描述一个系统。这意味着其思想其实是可以应用于任何类型应用的开发的,包括移动应用。

Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动。Redux 希望确保应用的视图是根据确定的状态来呈现的。意思就是,在任何时间点,你应用的状态总是确定、有效的,并且可以转换到另一个可预测和有效的状态。而 UI 将根据所处的状态来进行呈现。

关于 Redux 在网上已经有很多相关的资料,这里就只介绍下 Redux 核心的三个组件:

1.Store:保存应用的状态并提供一些帮助方法来存取状态,分发状态以及注册监听。

2.Actions:简单说 Actions 就是事件,包含要传递给 store 的信息,表明我们希望怎样改变应用的状态。比如,定义如下的一个 action:

data class AddTodoAction(val text: String)

由 store 来进行分发:

store.dispatch(AddTodoAction("Write blog post"))

3.Reducers:进行状态的转变。类似这样:

fun reduce(oldState: AppState, action: Action) : AppState {
    return when (action) {
        is AddToDoAction -> {
            oldState.copy(todo = ...)
        }
        else -> oldState
    }
}

介绍完核心组件,下面来看一下它们是怎么组合到一起的:

Redux flow

Redux 的流程很简单,你的应用根据当前状态呈现 UI,用户的交互触发 action,并交给 reducer 来更新状态。

最近,作者在一个还挺大的项目上试了下 Redux 架构,所以这里就分享下从中总结的一些经验。

1. 应用里最好不要有多个 store

针对不同模块有不同的 store 似乎是个不错的主意,但从上面的图可以看到每个 store 和其数据流是一个闭环系统,这就使得不同 store 之间的状态难以同步。这样你就通常需要在一个状态的变更响应中去进行另一个 store 的 action 分发,而这很容易造成无限循环。

另一个原因是多 store 的架构是非常僵化的,难以灵活的改动。

更好的做法是维护一个包含多个子状态的全局应用状态,由一个 store 来表示:

data class AppState(val LoginState,
                    val HomeScreenState,
                    val GridState )

2. 保持应用的状态层级尽可能少

因为 Redux 中 state 是不可变的,因此深层次嵌套的 state 会产生很多的样板代码,并且难以更新。比如,考虑下面的一组数据模型:

data class State(val sections: List<Section>)

open class Section(val articles: List<Article>)
class Home(articles: List<Article>) : Section(articles)
class Discover(articles: List<Article>) : Section(articles)

class Article

实例化和更新状态对象:

val state = State(sections = listOf(
                  Home(listOf(article1, article2)),
                  Discover(listOf(article1, article2))))

即使是用了 Kotlin 的 copy 机制,更新深层嵌套的属性(比如上面的 Article)也是非常单调乏味的:

val newHome = Home(listOf(newArticle, state.sections[0].articles[1]))
state.copy(sections = listOf(newHome, state.sections[1]))

3. Reducers 只是纯函数

Reduce 的作用只是处理 action 并返回新的 state 到 store 的,需要保证相同的输入总会得到一样的输出。Reduce 自身不应该有状态和执行任何额外工作,而只是做状态转换。

class Reducer {
    fun reduce(state: State, action: Action) : State {
        ...
    }
}

如果你需要响应某个 action,并执行一些操作,那应该考虑使用 Middleware。

4. 只用 Kotlin

Redux 很大部分受到 Flux 的启发,而关于 Flux 最常见的抱怨就是需要写一大堆的样板代码。而所选择的语言很大程度会决定你管理样板代码的便利性。

Kotlin 中类似 data class,when 语句之类的特性,能让你的代码清晰很多。例如,在 Reducer 中匹配 action 时,可以选择用 instanceof 方法实现。

if (action instanceof AddTodoAction) {
    return reduceAddTodoAction(oldState, action);
} else if (action instanceof RemoveTodoAction) {
    return reduceRemoveTodoAction(oldState, action);
} else if (...) {
    ...
}
return oldState;

当 action 很多时,这种写法就很痛苦了。如果用 Kotlin 就是这样的:

return when (action) {
    is AddTodoAction -> reduceAddTodoAction(oldState, action)
    is RemoveTodoAction -> reduceRemoveTodoAction(oldState, action)
    else -> oldState
}

结论

虽然,Redux 主要是被用于 Web 应用开发,但其思想我们还是可以学习并引入到 Android 中。但 Redux 也不是「银弹」,事实上也没有什么架构是,其在 Android 上的应用还很新,但我们还是很希望能看到它的逐渐成熟。

如果你对 Redux 在 Android 上运用有兴趣,可以看看 Redux 和 ReKotlin 这两个库。


原文链接: Lessons learned implementing Redux on Android - Pusher Blog
推荐阅读:Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标

详解Android中实现Redux方法 本篇文章给大家通过代码实例教学Android中实现Redux的方法,有需要的朋友跟着参考下吧。 立即下载

相关推荐

基于QGIS的DEM地形数据精细化处理:从裁剪、合并到成果输出

本文详细介绍了使用QGIS进行DEM地形数据的精细化处理流程,包括数据获取、裁剪、合并及成果输出等关键步骤。通过实战技巧和注意事项,帮助用户高效处理地形数据,适用于GIS分析、三维建模等应用场景。

weixin_29093017的博客 450

241.Redux架构

Redux 最初起源于 JavaScript 世界,用于解决前端应用状态管理问题,其核心思想是将整个应用的状态存储在一个全局的、只读的“Store”中,通过分发(dispatch)动作(Action)来更新状态,最终通过纯函数(Reducer)计算得出新的状态。Redux 强调“单一数据源”、“状态不可变”和“使用纯函数更新状态”这三个基本原则,因而具有可预测、可测试、可调试等显著特点。在 Android 开发中,尤其使用 Kotlin 语言,我们也可以应用 Redux 架构的思想。

2303_79132118的博客 1356

An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.

//谢谢Timm Krüger大佬的代码。 还是老样子,有啥问题Feel free to tell us~毕竟群众力量大嘛~QQ群:293267908。 // 话不多说,上干货! // ISBN 978-3-319-44649-3 (Electronic) // 978-3-319-44647-9 (Print) // http://www.springer.c...

weixin_37783345的博客 1418

android redux 架构,Redux 在 Android 中的应用

背景参考前端学习系列2:从移动端的角度学习与分析Redux一文,在React中Redux框架被用来将展示与数据分离以及管理状态的变化,扩展性非常好,而且便于测试,那我们不禁想到,能不能把这样一套框架移植到Android原生开发中来。Redux核心框架上图展示了Redux的数据流向:当用户操作View时可能引发数据的变化,这时候会经由ActionCreator产生特定的Action传递给Store;...

weixin_30500365的博客 635

RK3588与银河麒麟V10 SP1 2403深度适配:国产化硬件与操作系统的完美融合

本文深入探讨了RK3588处理器与银河麒麟V10 SP1 2403操作系统的深度适配,展示了国产化硬件与操作系统的完美融合。通过性能验证和实际应用测试,证明了这套组合在多媒体处理、AI推理和日常办公中的卓越表现,实现了完全自主可控的计算平台。

weixin_29194255的博客 249

【电磁场与电磁波课程设计】基于HFSS的双频微带天线仿真及设计

第五代移动通信技术(5G)的商用已经近在眼前,作为移动通信中最为重要的功能组件,面向5G通信应用的手机天线与基站天线的技术研究与设计成为近年来的热点。随着移动通信中“跳频”“扩频”等通信技术发展,为了满足与多个终端的通信要求,实现多系统共用和收发共用等功能,这就要求天线在不同频段下工作。根据国家工信部的最新规定,5G移动通信的中频段被划定在3.3 GHz-3.5 GHz及4.8 GHz-5.0 GH,面向5G移动通信的天线应具有高增益、小型化、宽频段及高隔离度等技术特征,以满足5G通信的高传输速率、波束智能

weixin_44450575的博客 1万+

android redux 架构,在 Android 中实现 Redux 的一点经验

简评: Redux 是一个用于应用程序状态管理的开源JavaScript库,其核心是通过可管理和控制的状态来描述一个系统。这意味着其思想其实是可以应用于任何类型应用的开发的,包括移动应用。Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动。Redux 希望确保应用的视图是根据确定的状态来呈现的。意思就是,在任何时间点,你应用的状态总是确定、有效的,并且可以转换到...

weixin_39836943的博客 351

【GB28181】wvp-GB28181-pro++ZLMediaKit编译安装国标流媒体服务器教程(Windows平台)

本文基于ZMLMediaKit+WVP-PRO在windows平台进行编译部署GB28181平台,网上教程也比较多,都大同小异,实际操作过程中容易出错的地方也比较多:redis安装无密码,mysql安装后密码的修改以及wvp数据可的创建,配置文件侧修改,尤其是和端口相关的项,再就是运行服务时各种错误需要注意,常见的错误已经做了汇总,遇到问题大家不要怕,找到报错的地方查看定位即可。

废人一枚的博客 4477

RxRedux - Android端的Redux框架

Android端先后出现了MVC、MVP、MVVM等多种应用架构,这些架构都是发源于Web前端开发而后被移动端借鉴和采用。近几年随着React等前段框架的兴起,Redux这种新的基于单向数据流的应用架构开始流行起来。Redux也会像前面几种MVX一样,从逐渐从前端出现到移动端,本文介绍的RxRedux便是一个Android端的Redux实现 Redux Redux是一个便于在React等声明式U...

移动端开发干货分享 2151

OpenHarmony深度定制:从系统到模块的全景剖析与自定义模块实战

目标:在中新增一个算法库,让产品可直接调用。关闭不用的 20+ 系统部件,ROM 缩小 50 %;为自家芯片新增专用驱动模块,快速点亮开发板;内将核心算法库以部件形式集成,实现商业闭源。万物互联时代,差异化才是护城河。

m0_67505153的博客 1032

基于STM32设计的掌上游戏机(运行NES游戏模拟器)详细开发过程

利用STM32单片机移植NES游戏模拟器,完成NES游戏开发,可以玩标准的NES游戏,已测试超级玛丽、魂斗罗之类的都可以正常运行。

4万+

Reductor:Android 上的 Redux 实现

Reductor:Android 上的 Redux 实现 项目介绍 Reductor 是一个受 Redux 启发的可预测状态容器库,专为 Java 和 Android 开发设计。它通过注解处理在编译时验证正确性并生成样板代码,使状态变更更易于阅读、编写和推理。Reductor 遵循 Redux 的三大原则:单一数据源、状态只读、状态变更由纯函数完成。其核心目标是保持 Redux 的原始概念,同时提...

gitblog_00023的博客 512

【全志V821_FoxPi】6-3 GC2083 MIPI摄像头适配

本文介绍了在全志V821芯片上适配GC2083 MIPI摄像头的方案。GC2083是一款支持1080P@30fps的高性能CMOS图像传感器,采用MIPI CSI-2接口,具有低功耗特性。文章详细列出了传感器的技术参数和工作电压要求,并提供了设备树配置示例,包括CSI接口、ISP处理单元和传感器节点的具体设置。通过快速配置命令one_gc2083_sensor或手动修改设备树即可启用该摄像头模组,适用于IPC等对图像质量有要求的嵌入式应用场景。

第四维度的博客 1925

android redux 架构,GitHub - xujinyang/ReduxAndroid: redux for android

Redux is a predictable state container for JavaScript apps Redux是 JavaScript 状态容器,提供可预测化的状态管理。Redux 文档开头就总结了Redux的意义。当然也非常详细的解释了Redux的三大原则和各模块作用,想入门请看Redux中文文档。当你已经理清楚了Action,Reduc...

weixin_28728443的博客 261

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

XCoreRedux框架:Android UI组件化与Redux实践

XCoreRedux框架:Android UI组件化与Redux实践@author: 莫川 https://github.com/nuptboyzhb/ XCoreRedux源码+Demo:https://github.com/nuptboyzhb/XCoreRedux 使用android studio打开该项目。目录结构 demo 基于xcore框架写的一个小demo xcore XCoreR

郑海波(莫川)的优快云博客 3532

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何用 Kotlin 实现 Redux

菩提本无树, 程序亦非猿时不时8:38推送优质文章,觉得有用,置顶加星标船长说:Redux 是一个 React 的库,用于状态管理。HelloVass 同学使用 Kotlin 来实...

程序亦非猿——一个能帮你进大厂的男人 531

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Redux ported to Java/Android:Java语言实现的Redux框架

Redux ported to Java/Android:Java语言实现的Redux框架 Redux ported to Java/Android 是一个将JavaScript中流行的Redux状态管理库移植到Java和Android平台的开源项目。该项目主要使用Java语言编写。 核心功能 该项目的主要功能是提供一个在Java和Android应用程序中管理应用状态的方法,类似于Redux在Ja...

gitblog_00343的博客 281

探索Reductor:Android的Redux解决方案

探索Reductor:Android的Redux解决方案 在移动应用开发的世界中,状态管理始终是一个核心挑战。随着应用的复杂性增加,如何有效地管理状态变得尤为重要。今天,我们将介绍一个强大的开源项目——Reductor,它是专为Android设计的Redux实现,旨在简化状态管理,提高代码的可读性和可维护性。 项目介绍 Reductor是一个受Redux启发的状态容器库,专为Java和Androi...

gitblog_01199的博客 910

用React Native开发Android —— 使用Redux框架

前言 1.redux简介 react native是去年开始大火的一门移动开发技术,采用与web端 react.js框架类似的思想,Js与原生控件交互,使之具有原生应用的流畅与交互效果,界面绘制采用CSS式更易入门,不过最好具备一些原生的开发知识。redux与react native没什么关系,但是react native中可以使用redux统一管理繁多的state,更加系统化。 2...

fjnu_se的博客 196

redux 路由跳转方式_如何用 Kotlin 实现 Redux

菩提本无树, 程序亦非猿时不时8:38推送优质文章,觉得有用,置顶加星标船长说:Redux 是一个 React 的库,用于状态管理。HelloVass 同学使用 Kotlin 来实现了一个 Redux,来看看他是怎么做的吧!感谢 HelloVass 投稿!~他的博客:https://hellovass.info/2020/03/30/kotlin%E5%AE%9E%E7%8E%B0...

weixin_42494891的博客 154

从Redux到MVI:前端思维在Android架构中的跨界实践

本文探讨了前端Redux架构思想在Android MVI架构中的跨界实践,详细解析了MVI与Redux的相似性及实现策略。通过单向数据流、不可变状态等核心概念,展示了如何在Android开发中应用Middleware、Reducer等Redux模式,提升状态管理的可预测性和调试便利性,为复杂应用开发提供架构解决方案。

1042

疯狂android讲义(kotlin版) 源码 pan_如何用 Kotlin 实现 Redux

菩提本无树, 程序亦非猿时不时8:38推送优质文章,觉得有用,置顶加星标船长说:Redux 是一个 React 的库,用于状态管理。HelloVass 同学使用 Kotlin 来实现了一个 Redux,来看看他是怎么做的吧!感谢 HelloVass 投稿!~他的博客:https://hellovass.info/2020/03/30/kotlin%E5%AE%9E%E7%8E%B0...

weixin_39726971的博客 679

Android状态管理终极指南:MobX与Redux深度对比

在Android应用开发中,**状态管理**是构建复杂应用的关键技术。随着应用规模的增长,如何高效管理应用状态成为开发者必须面对的挑战。本文将深入对比两种主流状态管理方案:MobX和Redux,帮助您选择最适合项目的方案。 ## 📊 状态管理架构模式对比 在Android开发中,**MobX和Redux**代表了两种不同的状态管理哲学。MobX采用响应式编程范式,而Redux遵循严格的单向数

gitblog_00702的博客 919
上一篇: 20 年后,我们怎么看电影?
下一篇: TOCTouch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
极光推送
博客等级 码龄14年 109粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值