ObjectAlreadyConsumedException: Erhalt der Karte bereits verbraucht

tl; dr

Ich versuche Daten von einer WritableMap, in der gleichen Klasse und zwei mal. Ich bekomme Receiving map already consumed Fehler und ich konnte mich nicht überwinden das Problem.


Ich habe die Entwicklung einer Einheitlichen Modul für meine Reagieren Native app.

Habe ich 2 Klassen. Einer von Ihnen ist MyModule Klasse (ist in MyModule.java Datei) und die andere ist eine Worker Klasse (ist in Worker.java Datei).

Zusätzlich Worker Klasse hat eine andere Klasse seiner Innenseite, dass heißt Work Klasse. Arbeit-Klasse bietet zwei Methoden zu tun, und man arbeitet-status.

Worker Klasse eine hash-Tabelle namens, wie mWorks. Worker-Klasse prüft die eingehenden workName ob die Arbeit bereits vorhanden ist oder nicht in seinem Konstruktor-Methode. Wenn die eingehende Arbeit ist bereits vorhanden, die Arbeit zugeordnet ist, die öffentliche work variable.

Wenn ich versuche zu nennen, getState() und doWork() in meine App (MyModule) bekomme ich die folgende Fehlermeldung;

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 rufe getState() – Methode der map-Daten-Feld verbraucht wird. Dann, wenn ich rufe doWork() bekomme ich die Fehlermeldung. Da rufe ich mWorker.work.getState() in beiden getState() und doWork().

Gibt es eine Möglichkeit, dies zu überwinden Ausnahme?

MyModule Klasse 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);
        }

    }
}

Worker-Klasse hat eine andere Klasse, die aufgerufen wird, zu Arbeiten.

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

}
InformationsquelleAutor efkan | 2016-05-12



One Reply
  1. 1

    War das problem response.putMap("workState", mWorker.work.getState()); Linie, die sich in der unmittelbaren nach successCallback.invoke!

    Hatte es, bevor die callback-aufrufen.

    • Wie das problem zu lösen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.