Android Tips #49 Android Query を使って jQuery 風に超シンプルにコーディングする

この記事は公開されてから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 で公開されているので自分で拡張することもできます。まずはお試しあれ!

参考