【问题标题】:Send data from Android activity to React Native将数据从 Android 活动发送到 React Native
【发布时间】:2018-01-25 14:16:35
【问题描述】:

我正在处理原生 android 活动中的意图,并希望将在意图中获得的数据发送到反应原生部分。请原谅我糟糕的术语/解释 - 在 Android 开发方面,我是一个完全的初学者。

我已尝试遵循本指南:https://facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript,但我一直无法获取主要的反应上下文。因此,意图来自应用程序之外,我想获取意图数据并启动应用程序。例如。主视图应该只显示意图中的文本。

这是我发送事件的方式:

public class CustomActivity extends ReactActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WritableMap map = Arguments.createMap();
    map.putString("messageString", "CustomMessage");

    try {
      getReactInstanceManager().getCurrentReactContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("customEvent", map);
    } catch (Exception e){
      Log.e("ReactNative", "Caught Exception: " + e.getMessage());
    }
}

这会引发异常

捕获异常:尝试调用虚方法 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' 在空对象引用上

我没有为活动定义自定义布局,而是想使用主应用的上下文。

【问题讨论】:

    标签: android android-intent react-native android-activity


    【解决方案1】:

    我在生产中遇到了几个

        Fatal Exception: java.lang.RuntimeException
                Unable to resume activity {minibar.android/minibar.android.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference
        Caused by java.lang.NullPointerException
                Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference
    

    所以解决方案是检查reactContext 是否不为空,否则创建侦听器并等待它:

    ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager();
    ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
    if(reactContext != null) {
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit("url", params);
    } else {
        reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
            @Override
            public void onReactContextInitialized(ReactContext context) {
                context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit("url", params);
                reactInstanceManager.removeReactInstanceEventListener(this);
            }
        });
    }
    

    【讨论】:

    • 太棒了!为我节省了大量时间!谢谢
    【解决方案2】:

    所以这似乎失败了,因为上下文没有及时创建。为了解决这个问题,我添加了一个繁忙的等待来创建上下文。

    while (getReactInstanceManager().getCurrentReactContext() == null);  // Busy wait.
    getReactInstanceManager().getCurrentReactContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("defineIntent", map);
    

    如果有人知道处理等待的更好方法,请在此处更新。谢谢!

    【讨论】:

    • 我相信我之前使用onStop而不是onCreate解决了这个问题
    • @Jared 你能举个例子说明你是如何做到的吗
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多