tl; dr
我嘗試在相同的類和兩次中獲取一個WritableMap的數據。我得到了Receiving map already consumed
錯誤,我無法解決這個問題。ObjectAlreadyConsumedException:接收地圖已經消耗
我一直在開發一個Native模塊以用於我的React-Native應用程序。
我有2個班。其中一個是MyModule
類(位於MyModule.java文件中),另一個是Worker
類(位於Worker.java文件中)。
另外Worker
班裏面有另一個班,裏面叫Work
班。工作類提供了兩種方法來完成工作並獲得工作狀態。
Worker
類有一個名爲mWorks
的散列表。 Worker類會檢查傳入的workName
工作是否已經存在或不在其構造方法中。如果傳入的工作已經存在,則將該工作分配給公共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()
方法的地圖數據字段被消耗。然後,如果我撥打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);
}
}
}
工人類有另一個類叫做工作。
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;
}
}
}