2016-05-12 69 views
0

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

} 

回答

1

問題是response.putMap("workState", mWorker.work.getState());線是眼前的successCallback.invoke後!

它必須在回調調用之前。