适用于Android的Flux架构

找到一个好的应用架构对于Android来说并非易事,Goodle似乎并不那么关心这方面,因为他们并没有推荐一个合适的应用架构。但是对于应用来说一个良好的架构是非常重要的。不管你是否同意,每个应用都应该有一个架构。因此,你最好为你的应用设计一个架构,而不是任由它发展。

## 清晰的软件架构

现在比较流行的架构是Bob大叔在2012年发表的、针对于Web应用的清晰的软件架构

但是我发现这个清晰的软件架构对于Android应用来说太过重量级了。
通常来说,移动应用都比web应用要简单。移动技术变化得很快,以至于今天发布的应用可能在一年之后就过时了。
移动应用通常比较简单,比较多的使用场景只是对数据的处理。从API获取数据、向用户展示数据。更多的是阅读,很少有写内容的需求。

这也使得移动应用的业务逻辑不会太过于复杂,至少不会比后端的应用复杂。当然,你也需要处理一些移动平台的问题:内存,存储,暂停,重新运行,网络,地理位置等等。但是这些并不是你的业务逻辑。

因此,对于大多数应用来说并不会从复杂的分层架构或者具有优先级的任务队列中获得太多益处。

它们可能只是需要简单的方式来组织代码,使得各部分组件之间高效的一起工作,并且容易查找bug。

## Flux 应用架构简介

Flux应用架构被facebook用于架构客户端Web应用,与Clean Architecture类似它也不是针对于移动应用的,它更简洁性能够让我们很方面的适用于Android应用。

有两个关键特性能够帮助我们理解Flux :

  • 数据流总是单向的
    一个 单向数据流是Flux 应用架构的核心,这也使得它很容易学习。当你需要测试应用时它也提供了很便利的条件。
  • 应用分为三部分 :
    • View : 应用接口,它用于将用户的交互转换为Action。
    • Dispatcher : 中央分发器,将所有action分发到处理它们每个Store;
    • Store : 维护特定应用领域的状态。它们根据当前的状态对action做出处理,执行业务逻辑,并且在处理完成时发出change事件。这个事件用于通知View更新UI。

这三部分通过Action交互,Action是通过type标识的简单对象,它包含了一些与action相关的数据。

## 适用于Android的Flux架构

在Android开发中使用Flux原则的主要目标就是创建一个简单、可伸缩、易于测试的应用架构。

第一步需要做的就是在Android组件之间建立Flux元素的关系映射。

这两类元素非常容易实现 :

  • View: Activity 或 Fragment;
  • Dispatcher: 一个事件总线,我在示例中使用了Otto,但是其他实现也是可以考虑的,例如AndroidEventBus

### Actions

Action也不复杂,它们通常是一些含有如下两个主要属性的简单的对象:

  • Type : 标识事件类型的一个String字段;
  • Data : 一个含有该Action信息的map字段。

例如,一个显示一些用户详细的action大致如下所示 :

1

2

3

4

Bundle
data

=

new

Bundle
(
)
;

data
.
put
(
"USER_ID"
,

id
)
;

Action
action

=

new

ViewAction
(
"SHOW_USER"
,

data
)
;

### Stores

Stores应该是Flux概念里最难理解的了。

如果你以前使用过Clean Architecture,你会感觉它也不是那么容易理解,因为Stores会假设职责已经被分割到不同的层。

Stores包含了应用的状态以及业务逻辑,它们很像功能完备的数据模型,但它们能够管理各种对象的状态,而不仅仅是其中一个。

Stores对Dispatcher发出的Action做出响应,执行业务逻辑,处理完成之后发出一个change事件。

Stores只会输出一个change事件,任何对一个Store的内部状态感兴趣的组件都需要监听该事件,并且使用它来获取数据。

系统中的其他部分并不需要了解应用的状态。

最终,Store必须暴露一个接口来获取应用状态.这样一来,View元素就能够查询Store的状态以及更新UI。

例如,在一个酒吧查找App中,SearchStore被用于追踪搜索到的酒吧、搜索结果和经过的酒吧历史数据。另一个ReviewedStore包含查看过的酒吧列表以及必须的逻辑,例如排序。

然后,有有一个重要的概念你必须要记住 : Store不是Repositories。它们的职责不是从外部资源(API或者数据库)中获取数据,只是追中action提供的数据。

那么Flux如何获取数据呢 ?

## 网络请求与异步调用

在前面的Flux图表中我特意省略了一部分: 网络调用。下一个图表将会完善这部分细节。

异步网络调用会从Actions Creator触发,一个网络适配器会触发一个异步的网络调用并且将结果返回到Actions Creator中。

最终Actions Creator将含有相应type与数据的Action分发出去。

所有的网络请求和异步操作从Store中隔离出来有两个优点 :

  • Store中的操作都是是完全同步的 : 这使得Store中的业务逻辑非常简单,bug也易于发现。并且,自从”所有的状态变化都必须是同步的”的运用到实际中,测试Store变得非常容易,只需要加载action,然后对最终的状态做一个断言判断;
  • 所有Action都是从Action Creator被触发 : 从一个统一的点创建和启动所有用户的action使得查找错误变得很简单。省去了在各种Class之间查找该action的发出点,所有的action都出自Action Creator。因为异步调用在action发出之前已经调用,因此其他ActionCreator的函数都是同步的,这很大程度上提升了代码的可追踪性和可测试性。

## Show me the code: To-Do App

这个例子是按照Flux架构实现的To-Do Android应用。

我尝试着尽量简单的演示如何使用Flux架构来构建一个组织良好的应用。

关于这个实现的一些解释 :

  • Dispatcher是使用了Otto事件总线实现。任何的事件总线也都可以的啦。在原来的Flux定义中,在上一个事件结束前就分发一个新的事件是不允许的,此时会抛出异常。为了代码比较简单,我在这个项目中并没有实现这个功能;
  • ActionsCreator类用于创建Action和将它们投递到Dispatcher。在Flux中这是一种比较常见的模式。
  • Action类型只有字符串常量。这也许不是最好的实现,但是是最快、最能保持简洁性的。

Action中的数据也只是使用key为String、value为Object类型的HashMap来存储。因此这需要你在Store中进行强制类型转换,一般得到具体的Action数据。当然,这并不是类型安全的,还是那句话 : 为了保持简单性。

## 结论

没有什么最好的Android应用架构,只有最适合你应用的架构。这个架构能够使你你和你的队友很方便地一起协作,在规定的时间内高质量的完成你的应用。

我相信Flux架构在这些方面还是比较靠谱的,不信就自己动手试试吧!

示例代码

代码在这里

深度阅读

时间: 2024-08-03 08:19:55

适用于Android的Flux架构的相关文章

Android - Flux架构

Flux架构, 顾名思义表示"流", 是以数据流为基础. 任何架构最终的目的都是让程序更加有序, 功能便于扩展, Bug容易追踪. Facebook使用Flux架构来构建客户端Web应用. Flux架构并不是为移动端设计的, 但是我们仍然可以采用这个思想在Android端使用. 基本架构模型如图: 模型主要分为四个模块: 1. View: 视图. 通过调用ActionCreator创建响应用户操作的Action. 2. Action: 事件. View通过ActionCreator发送

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些

Android的系统架构

Android的系统架构层分为四层: Application 主要是用于存放应用程序 Application FrameWord 支持应用层中的软件运行 Libraries+Android Runtime 系统库+安卓的运行环境 Linux Kernel 安卓底层是Linux内核,提供了各种驱动 转载请标明出处,谢谢!

Android 3D emulation 架构理解

Android Emulator 给用户提供  GPU on 选项,意思是利用 Host ( 就是执行 Emulator 的PC机) 的 GPU. 当然PC机必须把 OpenGL 的驱动装好 在实现上就是把 libGLESv1_CM.so  libGLESv2.so 替换掉,当system调用 gl的函数的时候,把调用打包为stream,并通过 pipe 发送到 host端处理,进入转化为对 host opengl的调用. 光这样还不够,还要把 libegl, libgralloc 都替换了,由

Android之系统架构

Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.Android采用WebKit浏览器引擎,具备触摸屏.高级图形显示和上网功能,用户能够在手机上查看电子邮件.搜索网址和观看视频节目等,比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入全部Web应用的单一平台.这里介绍Android的系统架构 android系统架构图 android的系统

react及flux架构范例Todomvc分析

react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 关于react react一个最吸引我的特性是组件,它是模块化的,所有的组件是独立的,又可以通过嵌套来构建更大型的组件,一个个小组件经过层层组装,最终形成web应用程序,它让我开始重新思考如何去构建大型的web应用程序. 关于Flux Flux是一个思想而非框架,强调数据自上而下传递的单向流动理念

安卓架构 视频 Android 插件化架构设计

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha Android 插件化架构设计-Dream老师 自定义SDK =====

Android存储系统的架构与设计

一.概述 本文讲述Android存储系统的架构与设计,基于Android 6.0的源码,涉及到最为核心的便是MountService和Vold这两个模块以及之间的交互.为了缩减篇幅,只展示部分核心代码. MountService:Android Binder服务端,运行在system_server进程,用于跟Vold进行消息通信,比如MountService向Vold发送挂载SD卡的命令,或者接收到来自Vold的外设热插拔事件.MountService作为Binder服务端,那么相应的Binde

Android系统的架构

android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.1.应用程序     Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等.所有的应用程序都是使用JAVA语言编写的.2.应用程序框架     开发人员也可以完全访问核心应用程序所使用的API框架.该应用程序的架构设计简化了组件的重用;任何