読者です 読者をやめる 読者になる 読者になる

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でまとめることができるのかなんかを考えたい。