使用例として、GOOGLEマップの経路情報を取得してみる。
private void searchRoute(LatLng origin, LatLng dest) { SandBox sandbox = new SandBox(); sandbox.setScheme("https"); sandbox.setAuthority("maps.googleapis.com"); sandbox.setPath("/maps/api/directions/json"); sandbox.putRequestor("origin", origin.latitude + "," + origin.longitude); sandbox.putRequestor("destination", dest.latitude + "," + dest.longitude); sandbox.putRequestor("language", "ja"); sandbox.putRequestor("sensor", "true"); sandbox.putRequestor("mode","walking"); sandbox.setProgress(findViewById(R.id.progressBar1)); SandBoxAsyncTask aTask = new SandBoxAsyncTask(this, sandbox, new RouteReceiver()); aTask.execute(sandbox.getRequestor()); }
this:アクティビティ
R.id.progressBar1:プログレスのID
RouteReceiver:受信処理で呼び出されるクラス
1、SandBox クラスを生成
2、サーバのアクセスに必要なパラメータなどを設定する
3、プログレスバーのオブジェクトを設定する
4、SandBoxAsyncTask(this, sandbox, new RouteReceiver()) で非同期タスクを生成する
5、タスクを実行する
コードはこんだけで、簡単にサンドボックスから情報を取得できる。
タスクを生成するとき設定するコールバックは、アクティビティで実装してもしても良いが、アクティビティがでかくなりすぎて可読性が悪くなる上お行儀が悪い!
なので、RouteReceiverというクラスを実装している。
RouteReceiver.java
import android.content.Context; import android.view.View; /** * @author Ryan's Factory * */ public class RouteReceiver implements SandBoxAsyncTaskCallback { /* (non-Javadoc) * @see com.ryans.factory.introcatmap.SandBoxAsyncTaskCallback#onPreExecuteSandBox(android.content.Context, java.lang.Object) */ @Override public void onPreExecuteSandBox(Context context, Object progress) { if (progress instanceof View) { ((View) progress).setVisibility(View.VISIBLE); } } /* (non-Javadoc) * @see com.ryans.factory.introcatmap.SandBoxAsyncTaskCallback#onSuccessSandBox(java.lang.String, android.content.Context, java.lang.Object) */ @Override public void onSuccessSandBox(String jsonString, Context context, Object progress) { if (progress instanceof View) { ((View) progress).setVisibility(View.GONE); } // パース処理を実装するならここに記述する } /* (non-Javadoc) * @see com.ryans.factory.introcatmap.SandBoxAsyncTaskCallback#onFailedSandBox(int, android.content.Context, java.lang.Object) */ @Override public void onFailedSandBox(int error, Context context, Object progress) { if (progress instanceof View) { ((View) progress).setVisibility(View.GONE); } // エラー処理を実装するならここに記述する } }
onPreExecuteSandBox() 通信前にプログレスバーをぐるぐると表示する
onSuccessSandBox() 通信が成功したのでプログレスバーを消してJSONデータをパースする
onFailedSandBox() 通信が失敗したのでプログレスバーを消してエラーだとユーザに通知する
前に、サンプルソースや参考書などの可読性が悪いと書いたが、あるブログにアプリケーションの実行速度を高めるためにする方法なるものがあった。
その内容は、
1、get/set関数は使用しない
2、内部クラスもしくは無名クラスを多用する
3、速度優先するリソースの場合は静的に配置する
などなど・・・
そんなんじゃ、可読性が悪くなるはずだ。
そんなことやって、少しはましになるだろうけど、メンテナンスはどうするのだろう・・・
処理速度優先ならば、C/C++で書きましょう!
Javaは遅いです。Javaの利点を無くしてコードを工夫して速度を高めるなんてやめましょう!
30年ほど前に、Cでは遅すぎてユーザのストレスが高くなるのでCソース最適化なんてものがあったけれど、
アセンブラで書けばそんなことしなくても、処理速度やリソースを有効に利用できる。
それと同じじゃ!
時代が変わっても、同じような輩が発生するんだな。