RN与android简单通信(四)

本文主要介绍RN与android之间的通信,大神绕步
混合开发中,我们经常会遇到各种各样的通信问题,比如java和C++之间的互相调用,ok,闲话少说,我们直入主题。

首先我们来实现一个简单功能:在js中点击一个按钮,传递一个字符串到native,然后在native端改变这个字符串,并返回给js端,说干就干,步骤如下

1.js中写一个按钮,并且绑定点击事件调用原生方法
2.写一个Module,并且添加到Package
3.native接受传递过来的参数,处理参数回调回js

接下来,我们会逐一实现上述步骤
1.在js里添加如下代码

'use strict'
import React, { Component} from 'react';
import { AsyncStorage,NativeModules,ToastAndroid } from 'react-native';
import {
  AppRegistry,
  StyleSheet,
  Text,
  Image,
  View
} from 'react-native';

let title = 'React Native界面';

export default class YRNTest extends Component {
    /**
    * Callback 通信方式
    */
    callbackComm(msg) {
        NativeModules.CommonModule.rnCallNativeFromCallback(msg,(result) => {
             ToastAndroid.show("CallBack收到消息:" + result, ToastAndroid.SHORT);
        })
    }

    /**
    * Promise 通信方式
    */
    promiseComm(msg) {
        NativeModules.CommonModule.rnCallNativeFromPromise(msg).then(
            (result) =>{
                ToastAndroid.show("Promise收到消息:" + result, ToastAndroid.SHORT)
            }
        ).catch((error) =>{console.log(error)});
    }

  render() {
    return (
      
        
            {title}
        
        
             Callback通信方式
        
        
             Promise通信方式
        
      
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#FFFFFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  }
});

AppRegistry.registerComponent('YRNTest', () => YRNTest);

注意这里的NativeModules.CommonModule.rnCallNativeFromCallback,我们js调用Native一般都是采用的NativeModules.模块名称.模块方法名称
2.定义Module类,继承ReactContextBaseJavaModule,在Module类中,我们定义一些交互的方法

public class CommonModule extends ReactContextBaseJavaModule {
    public CommonModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

  /**
     * RN调用Native的方法
    * Callback方式回调
     */
    @ReactMethod
    public void rnCallNativeFromCallback(String param, Callback callback) {
        String a = "啧啧啧:" + param;
        if (callback != null)
            callback.invoke(a);
    }

 /**
     * RN调用Native的方法
    * Promise方式回调
     */
    @ReactMethod
    public void rnCallNativeFromPromise(String msg, Promise promise) {
        String result = "啧啧啧:" + msg;
        promise.resolve(result);
    }

    @Override
    public String getName() {
        return "CommonModule";
    }
}

注意这里的getName方法返回的字符串要与上面的NativeModules.模块名称.模块方法名称里的模块名称保持一致。rnCallNativeFromCallback要与上面的NativeModules.模块名称.模块方法名称里的模块方法名称保持一致,并且在rnCallNativeFromCallback方法上还需要加上@ReactMethod注解

定义Package,实现ReactPackage接口,在createNativeModules方法里把自定义的CommonModule添加进去

public class CommPackage implements ReactPackage {
    @Override
    public List createNativeModules(ReactApplicationContext reactContext) {
        List modules = new ArrayList<>();
        modules.add(new CommonModule(reactContext));
        return modules;
    }

    @Override
    public List createViewManagers(ReactApplicationContext reactContext) {
        return null;
    }
}

最后在MyApplication里添加自定义的Package
RN与android简单通信(四)_第1张图片
1525320513500.jpg

3.这里只介绍Native回调回js的两种方式:CallBack和Promise

首先看一下Callback方式,通过callback的invoke方法把参数带回去

    @ReactMethod
    public void rnCallNativeFromCallback(String param, Callback callback) {
        String a = "啧啧啧:" + param;
        if (callback != null)
            callback.invoke(a);
    }

再来看下Promise方式,通过Promise的resolve方法把参数带回去

 @ReactMethod
    public void rnCallNativeFromPromise(String msg, Promise promise) {
        String result = "啧啧啧:" + msg;
        promise.resolve(result);
    }

你可能感兴趣的:(RN与android简单通信(四))