fkm blog

software開発に関することを書いていきます

TaskQueue作ってみた

今更感あるけど, 必要だったので作ってみた.

TaskQueue

簡単な使い方

1. TaskQueueオブジェクトを作る. 型パラメータは各Taskの結果オブジェクトの型

TaskQueue<String> queue = new TaskQueueImpl<String>();

2. Taskクラスを作る. もちろん無名クラスとして作ってもOK.
各Taskはexecute(TaskQueue)を実装する. 処理が終わったら引数で渡されるqueueオブジェクトのnotifyResult()を呼ぶ. 通信エラーとかでだめだったらnotifyError(Exception)を呼ぶ.

class MyTask extends Task<String> {
  private int mId;
  public MyTask(int id) {
    mId = id;
  }

  @Override
  public void execute(final TaskQueue<String> queue) {
    // Call Async API here
    mAPI.objectAPI().create(bucket, obj, new ObjectCallback() {
      @Override
      public void onSuccess(KiiObject o) {
        queue.notifyResult(o.getId());
      }
      @Override
      public void onError(Exception e) {
        queue.notifyError(e);
      }  
    });  
  }
}

3. QueueにTaskを詰める

まぁここは自然

for (int i = 0 ; i < 3 ; ++i) {
  queue.add(new MyTask(i));
}

4. 実行

全部ちゃんと終わればonSuccess()が呼ばれ, 途中でnotifyError()が呼ばれたらonError()がそこまでの結果とともに呼ばれる.

queue.execute(new TaskCallback<String>() {
  @Override
  public void onSuccess(List<String> result) {
    // You can use a list of <T> 
  }

  @Override
  public void onError(List<String> result, Exception e) {
    // Handle error
  }
});

なんで作ったの?

KiiLib-Android-Volleyが例によって非同期APIしかサポートしてないから(Volley使ってるから当然といえば当然だけど。。。). AsyncTaskだと, doInBackground()はその場で結果をreturnしないといけないので使えない。。。