React-Native 与原生的3种交互通信(Android)

前言

最近到新公司,采用React-Native开发App。在某些性能方面有问题或者模块特殊的开发情况,不可避免的需要我们原生开发(Android\IOS)给予前端开发支持。

在为前端书写模块部分,不可避免的要接触核心的通信部分。

大致分为2种情况:

  • Android主动向JS端传递事件、数据

  • JS端被动向Android询问获取事件、数据

方式优点缺点
事件方式:RCTDeviceEventEmitter可任意时刻传递,Native主导控制个人觉得此种方式缺点小
CallBack回调方式JS调用一次,Native返回一次CallBack为异步操作,返回时机不确定
Promises 方式JS调用一次,Native返回一次每次使用需要JS调用一次

效果图:这里写图片描述

①:Android向JS传递事件

采用RCTDeviceEventEmitter

在Native模块:

 //延迟0.1秒获取时间。
    @ReactMethod
    public void getTime() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                SimpleDateFormat formatDate = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
                Date date = new Date(System.currentTimeMillis());   
                String time = formatDate.format(date);

                WritableMap writableMap = new WritableNativeMap();
                writableMap.putString("key", time);
                sendTransMisson(mReactContext, "EventName", writableMap);

            }
        }).start();
    }


    /**
     * @param reactContext
     * @param eventName    事件名
     * @param params       传惨
     */
    public void sendTransMisson(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);

    }

getTime()主要为JS端调用Native的方法,在内部调用
sendTransMisson进行事件发送。 sendTransMisso这个方法名可以任意取

你喜欢就好,内部参数eventName为事件名,params为传递的事件属性。
在JS端接受:

 componentWillMount() {
        DeviceEventEmitter.addListener('EventName', function  (msg) {
            console.log(msg);
            ToastAndroid.show("DeviceEventEmitter收到消息:" + "\n" + msg.key, ToastAndroid.SHORT)

        });
    }

在componentWillMount进行监听事件获取传递的事件信息。

②:JS被动向Android询问事件、信息
  • CallBack回调接受:

Native部分:

@ReactMethod
    public void  callBackTime(String name,Callback callback){
        callback.invoke(getTimeMillis());
    }

CallBack对应的就是JS中的function,JS调用Native模块处理完毕以后将时间回调给JS端。

JS端发送:

 getCallBackTime() {
        NativeModules.TransMissonMoudle.callBackTime("Allure",
            (msg) => {
                console.log(msg);
                ToastAndroid.show("CallBack收到消息:"+msg,ToastAndroid.SHORT)

            }
        );

    }

向Native发送了一个名字Allure,在第二个参数接收回调结果。
Callback通俗简单易懂。

  • Promise传递

promise在js中很常见,而android也有类似的就是RxJava.可以通过链式将复杂代码结构转换为简短易读的代码。

由于promise不确定成功与失败,需要同步状态。 一般会调用then接口。
Native端:

 @ReactMethod
    public void sendPromiseTime(String name, Promise promise) {
        WritableMap writableMap=new WritableNativeMap();
        writableMap.putString("age","20");
        writableMap.putString("time",getTimeMillis());
        promise.resolve(writableMap);

    }

在此方法,接受了一个JS端传来的name,并且回传给JS端了一个字典,并存储了age和time两个字段。 需要注意的是使用Promise时,Promise参数需要放在最后一个参数里,否则JS接搜不到消息。

JS端:

 getPromiseTime() {
        NativeModules.TransMissonMoudle.sendPromiseTime("Allure").then(msg=> {
            console.log("年龄:" + msg.age + "/n" + "时间:" + msg.time);
            ToastAndroid.show("Promise收到消息:" + "\n" + "年龄:" + msg.age + "时间:" + msg.time, ToastAndroid.SHORT)

            this.setState({
                age: msg.age,
                time: msg.time,
            })
        }).catch(error=> {
            console.log(error);
        });
    }

JS端通过then接口来获取Promise的数据。

至此,JS与Native的三种通信方式就此结束,不知道各位是否读懂了呢? 若有疑问可以留言私信均可。

源码下载

注意在项目主目录先npm install。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
软件简介: 现代人常有失眠、入睡难、睡觉不踏实、入睡不深、怯恐症、焦虑症、强迫症、抑郁性神经症、适应障碍、厌学、迷恋游戏、心理创伤、交际障碍、神经疼痛、神经衰弱、神经性头痛、先天性神经衰弱等症状。 本软件采用催眠疗法的机理,可产生大自然的背景声,配合同步产生的的α波,让你的心情因其美妙动听的旋律和充满大自然的声音产生一莫名的安宁,从而让自己的心理进入一轻松缥缈的境地。这心理对有以上症状的人非常有益,可以让人的精神彻底放松,享受清净。从而在这状态中静静入睡,睡眠质量将得到很大改善。 本版是绿色破解版,无使用限制。可以自由添加睡眠音乐和任意设定关机时间。不想使用软件播放音乐,也可将音乐拷贝到MP3播放器中使用。 催眠音乐说明: 睡眠是每个人在生命中都必须满足的一绝对需要,就像食物和水一样。科学证明:人只要缺乏睡眠,失眠或是睡眠质量不高,就会变得坐立不安,情绪波动,记忆力减退,判断能力下降,甚至出现一些错觉和幻觉,以致难以坚持日常生活和活动。人的一生当中大约有三分之一的时间用于睡眠,所以,睡眠对每个人来讲,都是不可或缺的生命需要。 婴儿睡眠不足,不但影响身体生长,而且有可能影响大脑的正常发育。成年人睡眠不足,不仅影响其体力恢复,更不利于心理健康。老年人睡眠不足,可能加速脑的衰老。 失眠:通常指患者对睡眠时间和或质量不满足并影响白天社会功能的一主观体验。 1. 入睡困难 2. 不能熟睡 3. 早醒、醒后无法再入睡 4. 睡过之后精力没有恢复 5. 容易被惊醒,有的对声音敏感,有的对灯光敏感 ...... 失眠会引起人的疲劳感、不安、全身不适、无精打采、反应迟缓、头痛、记忆力不集中,它的最大影响是精神方面的,严重一点会导致精神分裂。 人生在世,五谷杂粮,巨大的社会竞争,纷繁的生活压力,复杂的情感纠葛......没有人可以彻底摆脱曾经失眠以及睡眠质量欠佳的困扰。也许现在暂时没有,但是将来谁也无法确保不发生。 本音乐向渴望健康睡眠的人们,提供了进入深度睡眠的有效办法。旋律轻柔、乐音委婉,营造特别的安然气氛,帮助失眠者克服不利睡眠的因素,是提升睡眠质量的最佳音疗选择。让充满活力的朝气重新恢复,让所有内在积压的压力与倦怠彻底的排遣。 美国音乐治疗协会,推荐休闲治疗方式。睡出谧静和天然朝气!都市纷繁复杂的快节奏,带来长期慢性疲劳和精神紧张,多久没有好好的睡上一个好觉了,暂且放下一切的执着,让音乐重新帮你找回失去已久的自然睡眠,静静的享受婴儿般深度睡眠的乐趣......在甜美的梦乡中再次遇到久违的白马王子和天使。 提示: 1.除可促进睡眠,亦可作为日常放松、休闲、静心、伴读等之聆听,宛若仙境、效果甚佳。 2.睡眠音乐开始作用不会显著,因为聆听者最初不熟悉音乐的旋律,总是好奇感居多,总是听音乐的心理多于疗效的心理,故初始较难进入意境状态,时间长了就会好的,才会体现音乐的作用。 3.睡眠音乐不能总听一个专辑,如同洗发水一样,总用一个牌子就会对去头屑产生抗体。音乐亦是如此,睡眠音乐应该在尽可能的情况下,通过实践找到几个适合自己静心放松的不同韵律专辑,轮换聆听,才会更加相得益彰。 4. 值得一提的是,本专辑CD1只有三首曲目,故每首曲目时间都相对较长,比如第1曲就有近30分钟的时间。实验证明,很多人在真正静心放松时,还未听完第一曲就已经进入了梦境。因此如果伴以入眠,家中无人时,请注意设置好播放器的定时功能,预防以免损耗机器及浪费电能的发生。 音乐目录: 1.舞随光动 Dancing with the Neon Light 2.深蓝梦 Dream in Dark Blue 3.心灵感悟 Sentiment of My Heart 4.细水长流 Running Water in the Long Rill 5.花絮轻撒 Rose Petal Floating 6.爱的轮回 Love is Around 7.月影摇曳 Shadow Shaking in the Moonlight 8.逐梦 Catching Dreams 9.萦绕天使 Angel Flying Around 10.夜宴 Deep Night

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值