Queryクラスによるサーバーアクセス
Pivotでサーバーにアクセスするには、org.apache.pivot.webパッケージに用意されている「Query」というクラスを利用します。これはWebサーバーへのアクセスに関する機能を提供するものです。このQueryは抽象クラスになっており、使用するHTTPメソッドごとに「GetQuery」「PostQuery」「PutQuery」「DeleteQuery」といったサブクラスが用意されています。
今回は、GETでアクセスしますので「GetQuery」クラスを利用しています。Queryの利用の仕方は、どのサブクラスでもほぼ共通しています。以下に簡単に整理しておきましょう。
1.インスタンスの作成
変数 = new GetQuery( サーバーの指定 , パスの指定 );
まず最初に、インスタンスを作成します。アクセスするサーバーとパスをそれぞれ引数に指定してnewします。
2.シリアライザの設定
《GetQuery》.setSerializer(《Serializer》);
続いて行ってるのは「シリアライザ」の設定です。シリアライザとは、データをシリアライズするためのオブジェクトです。これはPivotでは、Serializerというクラス(およびそのサブクラス)として用意されています。
GetQueryではアクセスした先からデータを取得しますが、そのデータがどのようなものかはGetQuery自身には分かりません。そこで、取得したデータを解析しJavaで扱いやすいオブジェクト化するためにシリアライザが用意されています。GetQueryにsetSerializerでシリアライザを設定すると、取得したデータをそのシリアライザでオブジェクト化し取り出せるようになります。
3.アクセスの実行
《GetQuery》.execute(《TaskAdapter》);
準備が整ったら、「execute」メソッドを呼び出し、アクセスを開始します。このメソッドでは、「TaskAdapter」というインスタンスを引数に渡します。これは実行するタスクを管理するためのもので、タスクが終了したり実行に失敗したりした時、イベントが発生し、必要な処理を行えるようになっています。アクセスが完了した後の処理は、GetQuery本体ではなく、このTaskAdapter側で行うようになります。
JSONSerializerによるデータの取得
このように、「Queryの用意」「シリアライザの設定」「TaskAdapterを準備して実行」といった流れでアクセスが行えるようになります。ということは、シリアライザとTaskAdapterについても、併せて理解しておく必要があるわけです。
まずシリアライザについて。今回は、Serializerのサブクラスである「JSONSerializer」というクラスを利用しています。これは、名前の通りJSONデータをシリアライズするためのものです。これはいくつかの引数がオーバーロードされています。今回は、引数にテキストのエンコーディングを指定してnewしています。
続いて、TaskAdapterについて。これは、引数に「TaskListener」を渡してnewします。TaskListenerというのは、文字通りタスク完了時などに発生するイベントの処理を行うためのリスナーです。これは2つのメソッドを持っています。今回のサンプルを見ると、次のような形でTaskListenerを用意していることが分かります。
new TaskListener<Object>() {
@Override
public void taskExecuted(Task<Object> task) {
……タスク完了時の処理……
}
@Override
public void executeFailed(Task<Object> task) {
……実行に失敗したりした時の処理……
}
}
いずれも、引数にはTaskクラスのインスタンスが渡されます。これは実行したタスクに関する情報を管理するものです。正常にタスクが終了したときには、「getResult」メソッドにより、取得したデータを取り出すことができます。このgetResultで得られるデータは、設定されたシリアライザによって内容が異なります。
今回、JSONSerializerを使ってアクセスをしましたが、この場合、データはListとして渡されることになります。List内には、各データがMapインスタンスとしてまとめられています。取得したListインスタンスを、そのままTableViewの「setTableData」メソッドでtableDataとして設定すれば、テーブルにデータがそのまま表示されます。また、Listから各データをMapとして取り出し、そこから必要な情報を取得して処理することもできます。
