2016-10-26 9 views
0

ループでは、コールバックを持つメソッドを複数回呼び出す必要があります。すべてが終わったとき、どうすればわかるのですか?ループ内のコールバック:すべて終了したときを知る方法?

@Override 
public void onObjectsMustBeParsed(String parsableObjects) { 
    String[] parsedObjects = parsableObjects.split(","); 

    for (String parsedObject : parsedObjects){ 

     loadObject(parsedObject, new LoadObjectCallback() { 
      @Override 
      public void onObjectLoaded(Object object) { 
       //Object Loaded 
       saveObject(object, new SaveObjectCallback() { 
        @Override 
        public void onObjectSaved() { 
         // Object saved 
        } 

        @Override 
        public void onError() { 
         // Object not saved 

        } 
       }); 
      } 

      @Override 
      public void onError(Throwable throwable) { 
       // Object not Loaded 

      } 
     }); 
    } 
} 


// => do something when all processing of parsed-objects are finished 
     // do something if all is ok 
     // do other thing if partially ok 

注:データを操作するために、私はローカルとリモートのデータソースを持つリポジトリを使用します。このコードはリポジトリの一部です。

+1

実行中のタスクの量を示す揮発性の整数を追加します。タスクを開始すると増加します。 onObjectLoadedまたはonObjectSavedの値の減少。その後、すべてのデクリメント後に、タスクカウンタがnulであるかどうかをチェックします。 – greenapps

+0

@greenapps Ouahかなりクールなソリューション!しかし私は私のレベルのコーディングですべてを理解しているのか分かりません。私は揮発性整数を知らなかった。そして、あなたは「すべての減少の後に」と言います。 – compte14031879

+0

@greenapps各コールバックで「すべての減少チェック後」を意味しますか? – compte14031879

答えて

1

は、実行中のタスクの量を示す整数揮発性を追加します。タスクを開始すると増加します。 onObjectLoadedまたはonObjectSavedの値の減少。その後、すべてのデクリメント後に、タスクカウンタがnulであるかどうかをチェックします。

1

同様のコメントへのアプローチが、代わりのAtomicIntegerを使用して:

AtomicInteger countDownLatch = null; 

    @Override 
    public void onObjectsMustBeParsed(String parsableObjects) { 
     String[] parsedObjects = parsableObjects.split(","); 

     countDownLatch = new AtomicInteger(parsedObjects.length); 
     for (String parsedObject : parsedObjects){ 

     loadObject(parsedObject, new LoadObjectCallback() { 
      @Override 
      public void onObjectLoaded(Object object) { 
       //Object Loaded 
       saveObject(object, new SaveObjectCallback() { 
        @Override 
        public void onObjectSaved() { 
        // Object saved 
        int value = countDownLatch.decrementAndGet(); 
        if (value == 0) { 
         // we are done 
        } 

        } 

        @Override 
        public void onError() { 
        // Object not saved 
        int value = countDownLatch.decrementAndGet(); 
        if (value == 0) { 
         // we are done 
        } 
        } 
       }); 
      } 

      @Override 
      public void onError(Throwable throwable) { 
       // Object not Loaded 

      } 
     }); 
     } 
    } 
+0

ありがとうございました! – compte14031879

関連する問題