android rn框架开发的例子,RN与安卓通信架构篇

本篇文章介绍的搭建Android与Rn之间的简易通信架构,需要了解通信的基本使用的同学可以参考下面的链接

开篇先上图 - “简易版的通信架构图”

73d97d93d40d

RN与Android之间通信的架构图

本架构实现的功能有:

自定义通信规则,并以Json作为数据传输格式进行传输

实现通信场景分两种: 1) RN主动向Android获取数据 2)Android主动向RN传输数据

先着重介绍场景1(RN主动向Android获取数据),进行数据传输的格式

协议:rn://xxxmodule?funTarget=main_cache

协议的Schema:‘rn://’标识为此通信的标识,可验证通信正确性

协议的Host:‘xxxmodule’此标识为传递给对应的业务模块执行。包括:网络加载模块,本地数据缓存模块等等。

协议的queryParams: ‘funTarget’ 这个key用于标识模块需要执行的动作。比如网络模块需要拉取个人信息,需要拉取首页信息,此标识用于执行动作的区分

如下例子:

rn://networkmodule?funTarget=person_info, 到网络模块中拉取个人信息

rn://networkmodule?funTarget=main_page, 到网络模块中拉取首页信息

以上协议贯穿了整个架构的设计,下面介绍代码实现部分

协议规则实现类BridgeUrlConfig, BridgeUrlConst

public interface BridgeUrlConst {

String RN_SCHEMA = "rn";

String RN_NETWORK_MODULE = "network";

String COMPLETE_RN_SCHEMA = RN_SCHEMA + "://";

}

public enum BridgeUrlConfig {

//target: 网络模块

NETWORK_MODULE(BridgeUrlConst.COMPLETE_RN_SCHEMA + BridgeUrlConst.RN_NETWORK_MODULE),

//action: 网络模块下执行main_cache动作

NETWORK_SYNC_MAIN_CACHE(NETWORK_MODULE, "main_cache"),

//action: 网络模块下执行second_cache动作

NETWORK_SYNC_SECOND_CACHE(NETWORK_MODULE, "second_cache"),

//action: 网络模块下执行request动作

NETWORK_ASYNC_REQUEST(NETWORK_MODULE, "request");

private String target;

private BridgeUrlConfig parentConfig;

BridgeUrlConfig(String target) {

this.target = target;

this.parentConfig = null;

}

BridgeUrlConfig(BridgeUrlConfig parentConfig, String target) {

this.target = target;

this.parentConfig = parentConfig;

}

public String getTarget() {

return target;

}

public BridgeUrlConfig getParentConfig() {

return parentConfig;

}

}

以上使用接口常量与枚举实现规则定义, 更直观的方便我们后面的解析解析和判断的使用

如何使用协议?RN与原生通信入口 BridgeUrlAnalysis

//用来声明模块

public interface IModuleExecuteEntry {

/*

* funTarget: 需要执行的action

* argJson: 执行此action需要的参数

* promise: 用于执行结果的回调,可查看官网文档,上方链接有说

* 明。注意异步或同步兼用回调返回。

*/

void execute(String funTarget, String argJson, Promise promise);

}

//通信协议执行入口类

public class BridgeUrlAnalysis {

private static BridgeUrlAnalysis bridgeUrlAnalysis = new BridgeUrlAnalysis();

private BridgeUrlAnalysis() {

}

public static BridgeUrlAnalysis getInstance() {

return bridgeUrlAnalysis;

}

final Map modules = new HashMap<>();

//1.注册可执行模块

{

modules.put(URI.create(BridgeUrlConfig.NETWORK_MODULE.getTarget()).getHost(), new NetworkModule());

}

/**

* //2.通信入口方法

* 正确的url格式:‘ react_native://xxxmodule?funTarget='main_cache' "

*

* @param url

* @param argsJson

*/

public void analysis(String url, String argsJson, Promise promise) {

if (TextUtils.isEmpty(url)) {

throw new RuntimeException("please url not empty");

}

URI uri = URI.create(url);

if (!uri.getScheme().equals(BridgeUrlConst.RN_SCHEMA)) {

throw new RuntimeException("please url not correct");

}

//根据url中的host获取对应注册的module

String host = uri.getHost();

IModuleExecuteEntry entry = modules.get(host);

if (entry == null) {

throw new RuntimeException("this target module not init");

}

//解析url中的query,获取name为“funTarget”的值

String paramString = uri.getQuery().split("#")[0];

Matcher matcher = Pattern.compile("(^|&)" + "funTarget=" + "([^&]*)").matcher(paramString);

matcher.lookingAt();

entry.execute(matcher.group(2), argsJson, promise);

}

}

以上类需要注意两点:

1.注册可执行协议的模块

2.通信协议的入口执行逻辑

然后介绍场景2,Android主动发送数据给RN

此处使用了事件发送技术,类似EventBus的用法。

因为比较简单就直接上Android代码

/**

* 1.原生模块可以在没有被调用的情况下往 JavaScript 发送事件通知

*/

public interface INativeSendToRnBridge {

/**

* 发送事件到RN上

* @param eventName 设置发送事件的名称,RN可对此名称的事件进行监听

* @param jsonObj

*/

void sendEvent(String eventName, String jsonObj);

}

/**

*具体实现类

*/

public class AndroidSendToRNBridge implements INativeSendToRnBridge {

private ReactContext mReactContext;

public AndroidSendToRNBridge(ReactContext context) {

this.mReactContext = context;

}

/**

* 发送数据的入口,规定了发送事件的格式

* eventName: 用于区分事件,相当于key

* jsonObj: 事件所包含的数据,相当于value。建议以Json格式数

* 据发送

*/

@Override

public void sendEvent(String eventName, String jsonObj) {

mReactContext

.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)

.emit(eventName, jsonObj);

}

public ReactContext getReactContext() {

return mReactContext;

}

public void setReactContext(ReactContext mReactContext) {

this.mReactContext = mReactContext;

}

}

本篇文章介绍完毕啦,需要源码的小伙伴可私信我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go 生成hash_go基础之map-写在前面(一)

为什么分析map在计算机编程语言当中&#xff0c;用的最多的数据结构估计就是map。map以他近乎o(1)的查找效率和修改效率让他在大多数场景下都比较受青睐。map的常规的实现方式都是hash其他数据结构&#xff0c;如java是hash红黑树&#xff0c;而我现在即将要分析的go的实现方式…

大学数学建模大赛是用计算机,北京大学第十届“江泽涵杯”数学建模与计算机应用竞赛试题...

消息来源&#xff1a;http://www.math.pku.edu.cn:8000/news/read.php?newsid8014A题&#xff1a;投篮问题投篮是篮球运动中一项关键性技术&#xff0c;是一项重要的得分手段。在篮球赛中有三种特殊的投篮方式&#xff0c;“三分球”、“两分球”和“一分球(罚篮)”。其中&…

dynamo方程怎么写_【简明自控】为什么特征方程如此重要

简明自动控制——为什么特征方程如此重要。热场视频&#xff1a;自平衡杆-双轴反作用轮倒立摆_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com顶个棍子&#xff01;具有主动脚轮的全向移动机器人_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com我自行车怎么少…

和佳股份有没有纳米机器人_新高赛复赛入围项目(49)一种纳米硅质绝热材料及其制备方法...

点击上方“蓝字”关注我们“2020中国山东新旧动能转换高价值专利培育大赛”(简称“新高赛”)是由山东省市场监督管理局(知识产权局)主办&#xff0c;由山东省知识产权事业发展中心、知识产权出版社有限责任公司共同承办的以新旧动能转换高价值专利培育为主题的创新大赛。新高赛…

mastercam加工报表生成_2020北京加工中心编程培训工厂教学行业

2020北京加工中心编程培训工厂教学行业河北德玛数控培训自办工厂 全程四轴五轴实践 学生直接面对客户 承揽加工各种异形件复杂件 终身技术支持 可勤工俭学 解决企业各种技术问题&#xff0c;每个校区都有实训车间&#xff0c;实训图档不限、不限、时间不限、并且不另收费&#…

背景调查 跳槽_分享 | 录用背景调查,查的到底是什么?

招聘对于HR而言&#xff0c;是一项常规工作&#xff0c;同时也是一项非常重要的工作&#xff0c;招聘有一系列的步骤和程序&#xff0c;每一道步骤和程序都必不可少&#xff0c;显得那么的重要&#xff0c;这其中包括我们常说的笔试、面试、体检&#xff0c;还包括不常说的正式…

.class文件转换.java_Java中的动态链接VS操作系统动态链接

在操作系统OS中为了优化内存的使用会采用一种动态链接方式&#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系操纵系统为什么需要动态…

宏观经济学gdp计算方法_宏观经济学考研的重要考点

宏观经济学考研重要考点西方国民收入核算宏观经济学的特点;国内生产总值;核算国民收入的两种算法(支出法和收入法);国内生产总值;个人可支配收入;国民收入的基本公式;名义GDP和实际GDP。要求&#xff1a;重点掌握本章基本概念及计算。简单国民收入决定理论均衡产出;凯恩斯的消费…

json符号解释大全_牛年汪姓男孩高端大气的名字大全

牛年汪姓男孩高端大气的名字大全 张桉宁起名分享牛年汪姓男孩高端大气的名字大全&#xff1a;给男孩起名有很多的讲究&#xff0c;需要从多个方面考虑。牛年汪姓男孩如何起一个高端大气的好名字&#xff0c;是家长朋友们都十分重视的。给牛年的汪姓男孩起一个高端的名字&#x…

变电站计算机在线监控系统,变电站环境在线监测系统

原标题&#xff1a;变电站环境在线监测系统概述随着计算机技术、网络通讯技术以及电力系统保护技术的发展&#xff0c;配电室的自动化运行水平不断提高&#xff0c;大大减少了人为操作&#xff0c;使配电室的无人值守逐步变成了可能。配电的可靠和安全是整个电能管理系统中的一…

什么意思是谁_舔狗是什么意思?如果不是真的喜欢谁又愿意做舔狗呢出处?

[海峡网]网络上面经常会出现一些新的词句&#xff0c;比如最近舔狗这个词就经常出现在大家的视线中。相信很多小伙伴都知道&#xff0c;最近关于虎牙的包子的事情也是挺多的&#xff0c;不过关于包桑的梗也是很多&#xff0c;那么关于包桑的这句“如果不是真的喜欢&#xff0c;…

计算机控制面板图标显示,Win8桌面如何有计算机/控制面板图标

Win8桌面如何有计算机/控制面板图标2013年06月04日 00:44作者&#xff1a;马承平编辑&#xff1a;马承平文章出处&#xff1a;泡泡网原创分享泡泡网系统工具频道6月4日 全新Windows8系统给我们带来不仅是超炫的动态磁贴展示&#xff0c;更有新增超级按钮项&#xff0c;它大大集…

计算机专业好还是铁道运输管理好,铁道运输管理专业主要是干什么的?

铁道运输管理专业主要是干什么的?铁道运输管理专业主要学什么&#xff1f;学铁道运营管理好就业吗&#xff1f;1、铁道交通运营管理专业主要培养德、智、体、美各方面全面发展&#xff0c;掌握所必需的基本理论和专业知识&#xff0c;有较高的综合素质和较强的铁道交通运营管理…

51单片机基本刷屏测试实验_51单片机开发基础8——实时时钟实验

8.1 实时时钟简介RTC(Real Time Clock)&#xff0c;是实时时钟的缩写&#xff0c;实时时钟是日常生活中应用最为广泛的功能。它为人们提供精确的实时时间&#xff0c;或者为电子系统提供精确的时间基准&#xff0c;目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有…

tensorflow超参数优化_机器学习模型的超参数优化

引言模型优化是机器学习算法实现中最困难的挑战之一。机器学习和深度学习理论的所有分支都致力于模型的优化。机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数。超参数与一般模型参数不同&#xff0c;超参数是在训练前提前设置的。举例来说…

南充一中计算机机房被盗,四川省CCF CSP-JS第一轮认证考试在南充一中成功举行...

10月11日&#xff0c;参加四川省青少年信息技术非专业级软件能力认证(CSP-JS)第一轮认证考试的来自遂宁市、南充市、达州市的220名参与认证的选手齐聚南充一中。软件能力认证(Certified Software Professional&#xff0c;简称CSP)&#xff0c;是由中国计算机学会举办&#xff…

软件测试浏览器的上传功能,关于浏览器上传控件的识别 - asoqa的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

1&#xff1a;基本的上传控件(图1、图2)图1&#xff1a;MSN上传照片图2&#xff1a;ogame论坛上传图片这种基本的上传控件QTP脚本在处理时有两种方式&#xff1a;1.1 识别Windows选择框对象Dialog和WinListView&#xff0c;有点繁琐&#xff0c;但是能精确的定位用户操作。Brow…

串灯控制盒去掉怎么接_单双向可控硅好坏怎么判断

大功率可控硅好坏判断单向可控硅的工作原理&#xff1a; 可控硅导通条件&#xff1a;一是可控硅阳极与阴极间必须加正向电压&#xff0c;二是控制极也要加正向电压。以上两个条件 单向可控硅的工作原理图&#xff3b;1&#xff3d;必须同时具备&#xff0c;可控硅才会处于导通状…

江西小学计算机说课稿,2019江西教师招聘面试-小学数学-说课稿

教师招聘面试-小学数学-说课稿——《分数的基本性质》尊敬的各位考官大家好&#xff0c;我是今天的X号考生&#xff0c;今天我说课的题目是《分数的基本性质》新课标指出&#xff1a;数学课程要面向全体学生&#xff0c;适应学生个性发展的需要&#xff0c;使得人人都能获得良好…

无光驱如何修复W7计算机,Win7电脑没有光驱怎么装系统?

现在很多人买台式电脑不会再配置光驱了&#xff0c;可是这就让人有疑问了&#xff0c;如果没有光驱怎么装系统呢&#xff1f;其实方法很简单&#xff0c;我们可以用U盘&#xff0c;但是要想使用U盘必须先制作启动盘&#xff0c;如果你不懂怎么制作启动盘的话&#xff0c;那就赶…