3

免责声明:因为这个问题与我的工作有关,我无法深入了解实际细节。我将尽量提供有关该问题的尽可能多的信息。另外,我是 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(...))。

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

  • 利用 EventEmitters:这样,App-B 中的 Java 代码将向 ReactNative JavaScript 代码发出一个带有标识符的事件。然而,该emit(…)方法只接受两个参数——“event_name/event_identifier”和一个对象。Object 可以是原始数据类型、Callback 或 WritableArray/WritableMap(在 ReactNative 框架中定义的集合)。由于我需要将上述“searchTerm”传递给 JavaScript 代码来发出网络请求,因此我无法传递 Callback 对象。如果我发送一个回调对象,那么我不能发送“searchTerm”,因为我只能传递一个参数。我认为Promise这里不起作用,因为我仍然无法发送“searchTerm”
// 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);
  • 定义 JavaScriptModule:定义和公开“JavaScriptModule”是 Native/Java 代码可以调用 JavaScript 代码中定义的方法的一种方式。可以定义此方法以根据需要采用尽可能多的参数/参数。这样做的想法是从 Native 代码调用 JavaScript 方法并同时传递 searchTerm 和回调对象。但是,当验证传递的参数时,会引发 RuntimeException,因为 JavaScriptModules 只能传递原始类型或“WritableMap/Array”对象的参数。Callback不支持对象。与Promise对象相同;它们不是受支持的参数类型。
// 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 通信方法吗?
- 这个用例还有其他可能性吗?

4

0 回答 0