gpt4 book ai didi

java - 对象已消耗异常 : Receiving map already consumed

转载 作者:行者123 更新时间:2023-12-01 09:56:21 28 4
gpt4 key购买 nike

tl;博士
我尝试在同一个类中获取 WritableMap 的数据两次。我收到接收 map 已消耗错误,但我无法解决该问题。

<小时/>

我一直在开发一个 native 模块以在我的 React-Native 应用程序中使用。

我有两个类。其中一个是 MyModule 类(位于 MyModule.java 文件中),另一个是 Worker 类(位于 Worker.java 文件中)。

此外,Worker类内部还有另一个类,称为Work类。 Work 类提供了两种方法来执行工作和获取工作状态。

Worker 类有一个名为 mWorks 的哈希表。 Worker 类检查传入的 workName 工作是否已存在于其构造函数方法中。如果传入的工作已经存在,则该工作将分配给公共(public) work 变量。

当我尝试在我的应用程序 (MyModule) 中调用 getState() 和 doWork() 时,出现以下错误;

E/unknown:React( 5578): Exception in native call from JS
E/unknown:React( 5578): com.facebook.react.bridge.ObjectAlreadyConsumedException: Receiving map already consumed
E/unknown:React( 5578): at com.facebook.react.bridge.WritableNativeMap.putNativeMap(Native Method)
E/unknown:React( 5578): at com.facebook.react.bridge.WritableNativeMap.putMap(WritableNativeMap.java:44)

我猜,当我调用getState()方法时, map 数据字段被消耗。然后,如果我调用 doWork() 我会收到错误。因为我在 getState()doWork() 中都调用了 mWorker.work.getState()

有机会克服这个异常吗?

MyModule 类有两个方法,名为 getState() 和 doWork()。

public class MyModule extends ReactContextBaseJavaModule {
...
private Worker mWorker = null;
...
public void getStatus(final String workName, final Callback successCallback) {
mWorker = new Worker(workName);

WritableMap response = new WritableNativeMap();
response.putMap("workState", mWorker.work.getState());

successCallback.invoke(response);
}

public void doWork(final String workName, final Callback successCallback) {
mWorker = new Worker(workName);

if(mWorker.work.doWork()) {
successCallback.invoke(response);
response.putMap("workState", mWorker.work.getState());
} else {
response.putMap("workState", mWorker.work.getState());
response.putString("message", "An error has been occurred.");
errorCallback.invoke(response);
}

}
}

Worker 类还有另一个类,称为 Work。

public class Worker {
...
public Work work;
private Hashtable<String, Work> mWorks = new Hashtable<String, Work>();
...
// CONSTRUCTOR
public Worker () {
Work work = null;

if (this.mWorks.containsKey(pWorkName)) {
Log.d(TAG, "Found an existing Work");
work = this.mWorks.get(pWorkName);
} else {
Log.d(TAG, "Creating a new Work");
work = new Work(pWorkName);
this.mWorks.put(pWorkName, work);
}
this.work = work;
}
...
public class Work {
...
public WritableMap getState() {
WritableMap result = new WritableNativeMap();

if (this.isCompleted()) {
result.putBoolean("Done", true);
} else {
result.putBoolean("Done", false);
}

return result;
}

public boolean doWork() {
// do something
return aBoolValue;
}
}

}

最佳答案

问题是response.putMap("workState", mWorker.work.getState());紧接 successCallback.invoke 之后的行!

它必须在回调调用之前。

关于java - 对象已消耗异常 : Receiving map already consumed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187058/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com