tl; dr
同じクラスと2回でWritableMapのデータを取得しようとしています。私はReceiving map already consumed
エラーを取得し、私はその問題を克服できませんでした。ObjectAlreadyConsumedException:受信マップがすでに消費されている
私はReact-Nativeアプリで使用するネイティブモジュールを開発しています。
私は2つのクラスを持っています。そのうちの1つはMyModule
クラス(MyModule.javaファイルにあります)ともう1つはWorker
クラス(Worker.javaファイルにあります)です。
さらに、Worker
クラスには、Work
クラスと呼ばれる別のクラスがあります。ワーク・クラスは、作品をして作品の状態を取得する2つの方法を提供します。
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()という名前の2つのメソッドがあります。
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);
}
}
}
ワーカークラスには、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;
}
}
}