この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Android Query とは
Android Query とは、Android アプリの実装を jQuery のようにコーディングできるようにするライブラリです。UI に関わる処理や非同期処理などをメソッドチェーンなどを利用して簡潔に記述することができます。今回はそんな Android Query をちょっと触ってみました。
Android Query を導入する
まずは以下のダウンロードページからライブラリをダウンロードしましょう。最新バージョンは 0.25.10 のようです (2013年5月14日現在) 。
https://code.google.com/p/android-query/downloads/list
ダウンロードしたら、お好きな Android アプリプロジェクトの libs フォルダに配置すれば完了です!
Android Query で実装する
では早速実装してみましょう。いろいろな処理を Android Query を使わない場合と使った場合でそれぞれ Before / After してみました。
View の操作
Before
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ボタンにリスナをセットする
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "button clicked");
}
});
// TextViewにテキストをセットする
TextView textView = (TextView) findViewById(R.id.text_view);
textView.setText("Test");
}
After
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AQuery aq = new AQuery(this);
// ボタンにリスナをセットする
aq.id(R.id.button).clicked(this, "onClick");
// TextViewにテキストをセットする
aq.id(R.id.text_view).text("Test");
}
public void onClick(View view) {
Log.d(TAG, "button clicked");
}
Button にリスナをセットするコードと TextView にテキストをセットするコードの比較です。Android Query は基本的に AQuery インスタンスを使ってコーディングしていきます。findViewById() にあたるメソッドが id() 、setOnClickListener() にあたるメソッドが clicked() になります。メソッド名も jQuery っぽいので分かりやすいですし、何よりメソッド名が短いのでコードがコンパクトになりますね。また TextView にキャストしなくてもテキストをセットできます。冗長にならないのでいい感じですね!
HTTP 通信
Before
public class JsonLoader extends AsyncTaskLoader<JSONObject> {
public JsonLoader(Context context) {
super(context);
forceLoad();
}
@Override
public JSONObject loadInBackground() {
String url="http://www.google.com/uds/GnewsSearch?q=Obama&v=1.0";
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse res = null;
try {
res = httpClient.execute(get);
HttpEntity entity = res.getEntity();
String body = EntityUtils.toString(entity);
return new JSONObject(body);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
After
public void asyncJson() {
AQuery aq = new AQuery(this);
String url = "http://www.google.com/uds/GnewsSearch?q=Obama&v=1.0";
aq.ajax(url, JSONObject.class, this, "jsonCallback");
}
public void jsonCallback(String url, JSONObject json, AjaxStatus status) {
if (json != null) {
Log.d(TAG, json.toString());
} else {
Log.e(TAG, "error");
}
}
HTTP 通信処理(非同期処理)は劇的に変わりますね!Before のコードは AsyncTaskLoader の実装だけ載せましたが、さらにこのクラスのコールバックも実装しなければいけません。。それに対し Android Query は ajax() メソッドを呼び出すだけ!超シンプルになりますね〜。
画像のロード
Before
public class ImageLoader extends AsyncTaskLoader<Bitmap> {
public ImageLoader(Context context) {
super(context);
forceLoad();
}
@Override
public Bitmap loadInBackground() {
try {
URL url = new URL("http://www.vikispot.com/z/images/vikispot/android-w.png");
InputStream stream;
stream = url.openStream();
return BitmapFactory.decodeStream(stream);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
After
private void loadImage() {
AQuery aq = new AQuery(this);
aq.id(R.id.image_view).image("http://www.vikispot.com/z/images/vikispot/android-w.png");
}
この処理も劇的に変わりますね!画像 URL を非同期で読み込む処理ですが、こちらも Before は AsyncTaskLoader の実装を載せましたが、HTTP 通信処理同様、さらにこれを Activity から呼び出し ImageView にセットする処理も書かなければいけません。Android Query では id() で ImageView を取得し、そのままメソッドチェーンで書いてます。これだけで非同期処理までやってくれます。超楽ですね!メモリキャッシュ・ファイルキャッシュにも対応しているメソッドがあるので、かゆいところにも手が届いています。
まとめ
以上、Android Query の簡単な紹介でした。特に非同期通信処理の実装が劇的にシンプルになりますね!メソッドチェーンで柔軟、かつ簡潔にコーディングできて良い感じです。ちなみに Apache Lisencse 2.0 なので商用利用も可ですし、ソースコードは GitHub で公開されているので自分で拡張することもできます。まずはお試しあれ!