首页 > 解决方案 > 当 Native 代码 (Java) 在 ReactNative 中调用 Javascript 代码时期望响应

问题描述

免责声明:因为这个问题与我的工作有关,我无法深入了解实际细节。我将尽量提供有关该问题的尽可能多的信息。另外,我是 ReactNative 的新手。一周后才开始使用它,我可能会问一些非常琐碎的问题。

背景
有两个应用程序,我们称它们为 App-A 和 App-B。App-A 具有启动活动或从 App-B 获取某种信息的规定。请求某些信息时建立通信合约的方式是 App-A 会startActivityForResult。意图将明确引用有问题的 App-B 的 Activity(无头 Activity;没有 UI;每个操作都在后台处理)。App-B 应该(理想情况下)将请求发送到它的后端服务,在调用之前获取响应和setResult(...)活动finish()。我还没有最后一部分工作(这是下面讨论的问题的症结所在)

App-B 的结构
App-B 将 ReactNative 用于大多数客户端的东西。App-B 进行的网络 API 调用都是在 JavaScript 代码中完成的。当 App-A 发出“搜索”请求时,它会传递 App-B 必须发送到其后端服务以获取结果/响应的“searchTerm”。收到响应后,必须通过setResult(…)在 Activity 的上下文中使用“设置结果”将其发送回 App-A。

问题
问题是将响应/结果从 JavaScript 代码传递到 App-B 中的本机代码。由于我需要在 App-B 的活动上“保持请求处于活动状态”,因此我需要“等待”结果可用,然后再设置结果以供 App-A 使用 ( setResult(...))。

这是我到目前为止尝试过的

// The "emit" method call below only takes 2 arguments. I can only pass
// either the "searchTerm" or a "Callback"
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)(eventName, someObject);
// Defined a SearchModule like so (required Module registration is done using ReactPackage 
// and setting it in the setPackages() method)
// Followed this: https://stackoverflow.com/questions/38661060/are-there-any-guides-for-implementing-javascriptmodule-in-react-native

// Unfortunately, this throws a RuntimeException since "Callback" is not a 
// supported argument
public interface MySearchModule extends JavaScriptModule {
    void call(String eventType, String searchQuery, Callback callback);
}

/**
 * Different file below
 */

// Arguments.java code snippet in the RN framework
for(int i = 0; i < args.length; ++i) {
    Object argument = args[i];
    if (argument == null) {
        arguments.pushNull();
    } else {
        Class argumentClass = argument.getClass();
        if (argumentClass == Boolean.class) {
            arguments.pushBoolean((Boolean)argument);
        } else if (argumentClass == Integer.class) {
            arguments.pushDouble(((Integer)argument).doubleValue());
        } else if (argumentClass == Double.class) {
            arguments.pushDouble((Double)argument);
        } else if (argumentClass == Float.class) {
            arguments.pushDouble(((Float)argument).doubleValue());
        } else if (argumentClass == String.class) {
            arguments.pushString(argument.toString());
        } else if (argumentClass == WritableNativeMap.class) {
            arguments.pushMap((WritableNativeMap)argument);
        } else {
            if (argumentClass != WritableNativeArray.class) {
                throw new RuntimeException("Cannot convert argument of type " + argumentClass);
            }

            arguments.pushArray((WritableNativeArray)argument);
        }
    }
}

我的问题
- 是否有可能在 ReactNative 框架中实现这样的事情,其中​​ Java 代码(活动)可以通过传递一堆参数来调用 JavaScript 代码并得到响应?
- 有什么关于 EventEmitters/JavaScriptModule 的东西可以用来实现所需的结果吗?
- 除了 EventEmitters/JavaScriptModule 还有其他的 Native/JavaScript 通信方法吗?
- 这个用例还有其他可能性吗?

标签: androidreact-nativereact-native-androidreact-native-bridge

解决方案


推荐阅读