AndroidQueryをやめてRetrofitを使ったら捗った話
AndroidでAPIとやり取りする場合、HttpURLConnectionとか使ってスクラッチで書いてもいいんですが、ライブラリを使ったほうが簡単に書けます。
そのような便利ライブラリの1つにAndroidQueryというのがあります。名前からわかるとおりjQueryに影響を受けており、メソッドチェーンを使って簡単にGET・POSTを実装できます。
僕ももともとAndroidQueryを使っていたんですが、今回Retforitというライブラリに置き換えたところコード量も減りとてもいい感じだったのでメモしておきます。
(1)Before After
まずはBefore Afterから。
[Before: AndroidQuery]
private void loadUsers() {
final AjaxCallback cb = new AjaxCallback() {
@Override
public void callback(String url, JSONArray json, AjaxStatus status) {
if (json != null) {
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
final Type type = new TypeToken<List>() {}.getType();
List<User> users = gson.fromJson(json.toString(), type);
Log.d(TAG, "success");
} else {
Log.e(TAG, status.getMessage() + "");
}
}
};
new AQuery(this).ajax(url, JSONArray.class, cb);
}
[After: Retrofit]
private void loadUsers() {
MainApplication.API.getUsers(new Callback<List>() {
@Override
public void failure(RetrofitError e) {
Log.e(TAG, e.getMessage() + "");
}
@Override
public void success(List<User> users, Response response) {
Log.d(TAG, "success");
}
});
}
わかりやすくするために最低限の部分だけ引用しましたが、かなりスッキリしました。メリットをまとめるとこんな感じです。
- Callbackクラスのインターフェースメソッドがわかりやすくていい感じ。
- URLを各処理の中ではなく別のクラスにまとめて書いておくことができて見通しがいい。
- Gsonでのparseも初期化処理で記述しておけば各処理の中で書かなくていい。
- 通信部分だけのライブラリなのでAndroidQueryよりもずっと軽量。
- RestAdapterというクラスを使うことでDIしやすくなる。
- モック用のライブラリも梱包されておりテストも書きやすい。
導入も簡単だったので、APIを1つずつAndroidQueryからのせかえていきました。
(2)Retrofit導入手順
Retrofitを使う手順は簡単です。
1.build.gradleにdependenciesを記述。
Retrofitのライブラリをインポートするための設定を書きます。
dependencies {
compile 'com.squareup.retrofit:retrofit:1.6.0'
}
2.API用のインターフェースを作成
インターフェースクラスを作成します。僕はserviceパッケージ内にApiServiceという名前で作成しました。
public interface ApiService {
public static final String API_URL = "http://konifar.com";
static final String PATH_USERS = "/users";
static final String EXT_JSON = ".json";
@GET(PATH_USERS + EXT_JSON)
void getUsers(Callback<List<User>> cb);
}
3.Applicationクラスで初期化
先ほどのインターフェースを使って、Applicationクラスの中で初期化処理を書きます。
public class MainApplication extends Application {
private static Gson GSON = new GsonBuilder().setDateFormat(Constants.JSON_DATE_FORMAT).create();
private static RestAdapter REST_ADAPTER = new RestAdapter.Builder()
.setEndpoint(ApiService.APP_URL).setConverter(new GsonConverter(GSON)).build();
public static ApiService API = REST_ADAPTER.create(ApiService.class);
}
これで、通信したいところで、MainApplication.API.getUsers のように呼び出すことができるようになります。
4.APIを増やす時はApiServiceにAPIを追加
APIを増やす時は、ApiServiceにメソッドを追加するだけです。ApiServiceクラスにまとまっているのでとても見通しがよいです。
またインターフェースにしているので、モッククラスを作ってDIすることも簡単にできます。Daggerとの相性バツグンです。
multipart POSTにも対応しており、こんな感じでメソッドを定義すれば画像の送信もできます。
@Multipart @POST(PATH_USERS + EXT_JSON) void postUser(@Part(PARAM_NAME) TypedString name, @Part(PARAM_IMAGE) TypedFile image, Callback<User> cb);
大きめのアプリになるとAPIの数も比例して多くなるので、呼び出し部分はなるべくシンプルに書けるようにした方が開発スピード上がります。Retrofitとてもいい感じなので、RESTfulなAPIで開発している方は試してみてはどうでしょうか。
以上!