LoginSignup
36
34

More than 5 years have passed since last update.

JobQueue をクライアントサイドで実現する

Last updated at Posted at 2014-04-21

ネットワークを用いたサーバサイドとのやりとりをする必要のあるアプリケーションでは特に、まとまったリクエストをバックグラウンドで捌き続けてくれる、JobQueue の仕組みが欲しくなることが有ります。
ネットワーク I/O を伴わなくても、様々な処理のまとまり(ジョブ)を非同期に逐次実行したり、電源が切れても、再起動した時にジョブの続きを勝手に処理してくれたりするような、永続化の仕組みと組み合わせられた JobQueue はとても便利です。
これによって、長時間かけて実行される非同期処理が簡単に取り扱えるようになります。

Android、iOS ともに、バックグラウンドで逐次実行する簡易な仕組みは標準フレームワークでも用意されています(IntentServiceとかNSOperationNSOperationQueueとか)が、オンメモリで管理されるので、電源が切れたりすると無かったことに…
このため、電源を切ってもキューに積んだジョブが保持されるようにするためには、何らかの永続化の仕組みを用いて管理する必要があります。

Android、iOS ともに、これらを実現するライブラリがいくつか有ります。

Android

Android Priority JobQueue

Path が出しているオープンソースのライブラリです。MIT ライセンスで配布されています。

優先順位付けのあるキューを用いて、優先順位の高いものからジョブをさばいてくれます。
ネットワークにアクセスする必要のあるジョブがキューに積まれている場合、コネクションが無い時は優先順位にかかわらず他のネットワークを必要としないジョブが優先して実行されます。
また、ジョブのグループ化を行って、並列実行されては困るジョブのリストを逐次実行するようにしてくれたり、ジョブの実行を遅延したり、リトライの判断を自分で拡張できたりします。

nirai

Android Advent Calendar 2013 で公開されたライブラリです。Apache ライセンスで配布されています。
シンプルな API で、キューに積まれたジョブを逐次実行してくれます。

ネットワーク I/O の実行を前提として作られており、ジョブの実行中に I/O の例外が発生した場合にNetworkOfflineExceptionをスローすることで、一定の時間を経過した後自動でジョブをリトライしてくれます。

iOS

queue

GCD と SQLite3 によるジョブキューの実装です。用意されたデリゲートメソッドにしたがって実装することで、あとの面倒はこのライブラリが見てくれます。
iOS5 以上をサポートしています。

ジョブの結果はデリゲートメソッドの返り値として表現しますが、EDQueueResultによって表される状態に応じて、ジョブが終わった時の振る舞いが変わります。
特に、失敗時にリトライをするかどうかが変わるところが注意を必要とします。

36
34
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
34