2016-05-12 6 views
0

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; 
     } 
    } 

} 

Antwort

1

Das Problem war response.putMap("workState", mWorker.work.getState()); Linie, die nach successCallback.invoke in unmittelbarer ist!

Es musste vor dem Rückruf aufrufen.

Verwandte Themen