tl; dr
Ich versuche, Daten von einer WritableMap, in der gleichen Klasse und zweimal. Ich bekomme Receiving map already consumed
Fehler und ich konnte dieses Problem nicht überwinden.ObjectAlreadyConsumedException: Empfangen Karte verbraucht bereits
Ich habe einen india Modul entwickelt in meinem React-native App zu verwenden.
Ich habe 2 Klassen. Einer von ihnen ist MyModule
Klasse (ist in MyModule.java Datei) und der andere ist eine Worker
Klasse (ist in Worker.java Datei).
Zusätzlich Worker
Klasse hat eine andere Klasse sein innerhalb, die Work
Klasse genannt wird. Die Arbeitsklasse bietet zwei Methoden, um Arbeiten auszuführen und den Arbeitsstatus zu erhalten.
Worker
Klasse hat eine Hash-Tabelle als mWorks
genannt. Die Worker-Klasse überprüft die eingehende workName
, ob die Arbeit in ihrer Konstruktormethode bereits vorhanden ist oder nicht. Wenn die eingehende Arbeit bereits vorhanden ist, wird die Arbeit der Variablen work
zugewiesen.
Wenn ich versuche, getState() und doWork() in meiner App (MyModule) aufzurufen, erhalte ich den folgenden Fehler;
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)
Ich denke,, wenn ich getState()
Methode das Kartendatenfeld verbraucht nennen. Dann wenn ich doWork()
rufe bekomme ich den Fehler. Denn ich rufe mWorker.work.getState()
sowohl in getState()
als auch in doWork()
an.
Gibt es eine Chance, diese Ausnahme zu überwinden?
MyModule Klasse haben zwei Methoden namens getState() und 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);
}
}
}
Arbeiterklasse hat eine andere Klasse, die Arbeit genannt wird.
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;
}
}
}