2016-05-12 11 views
0

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

} 

答えて

1

問題がsuccessCallback.invoke後即時にあるresponse.putMap("workState", mWorker.work.getState());ラインでした!

コールバックを呼び出す前に実行する必要がありました。

関連する問題