UIを非同期としてPromiseやFutureとして扱うものがなかなかない
非同期を扱う為にJavaScriptではDeferredが導入された。関数型言語だとPromiseかな。
JavaだとFutureなんかが近い。
ネットワークなんかでもこういうFutureやPromiseを使用したライブラリなんかはみつかる。
https://github.com/AsyncHttpClient/async-http-client とかがそうだ
ネットワーク用のライブラリなんかで非同期をFutureやPromiseとしてあつかうのはよいのだけれど、ひとつ大事なことを忘れてしまっている、それはUIこそが非同期の大部分ということだ。
最近UIにかかる部分をFeture化してプログラミングしたいなということ
例えば図書の貸し出しだと、貸し出しの為に必要な情報をユーザーに入力してもらうけど、その入力をオブジェクト化してFutureとして取り扱いたいという感じ。
イメージとしては、下記のようなコード。
/* 貸し出しボタンを押す事で貸し出しのプロセスを開始 */ public void onClick(View v) { startRentalBookProcess(); } /* 貸し出しプロセスの実装, 必要な情報をダイアログとかで表示して、確定した内容をAPIサーバーに送信し、貸し出し契約を作成するみたいなイメージ この処理はUIThread以外で実行されないといけない*/ public void startRentalBookProcess() { Future<RentalForm> f = activity.confirmRentalRequest(); RentalForm form = f.get(); Future<RentalContract> c = httpclient.preparePost("rental api").setBody(form.toSring()).execute(); RentalContract = c.get(); }
普通は処理は多少の分岐はあれどまっすぐ流したいのに、AndroidのUIスレッドは5秒以上の処理ができないようにしている状況になる。その状態でFutureつかっても意味が無い訳でFutureつかうときは処理が止まってもよいThread上で実行しておかなくてはならない。
とりあえずUIを非同期処理と考えてFutureを適用するのは良い考えだとおもうので、ダイアログ、インテントを使用したstartActivityForResultやFragmentあたりでこれらを本当にFutureでまとめることができるのかなんかを考えたい。