RetroFitって何?
AndroidのREST通信を簡潔にし、POJO変換もしてくれるライブラリ。
AsyncLoaderだのjsonObjectだのに振り回されなくて済むので非常にありがたいです。
Retrofitの導入
http://square.github.io/retrofit/
- gradleに以下追記
※最新バージョンは公式参照の事
app/build.gradle
dependencies {
// 以下追記
compile 'com.squareup.retrofit:retrofit:1.6.1'
}
レスポンス用のオブジェクトを生成
- jsonschema2pojoを利用してjsonから生成
http://www.jsonschema2pojo.org/
※基本的には、Source typeはJSON、Annotation styleはNoneでOK
注意!!
レスポンスパラメータがスネークケースだと自動変換してくれないので、
サーバ側で返すパラメータはキャメルにしておきましょう。
各部実装
ちょっと長いですが、今回はObserverパターンを利用して汎用的に使えるコールバックも併せて定義しています。
一度作っておくとあとで非常に楽になります。
- まずはマニフェスト
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.hoge.hogehoge" >
<!-- インターネット接続用のパーミッションと、ネットワーク状況取得用の
パーミッションを追加する。 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 省略 -->
</manifest>
- 今回はActivityに書いてますが、もちろんFragmentでも構いません。
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// デフォルトのアダプター(converter)はjson用
// json以外の形式をサポートするには別途converterの実装が必要
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://www.test.jp")
.build();
RetroFitApi service = restAdapter.create(RetroFitApi.class);
service.getNew("hoge", new RequestCallback<ArticleList>(new ArticleListener()));
}
// コールバックリスナーの定義
public class ArticleListener implements RequestListener<ArticleList> {
@Override
public void onSuccess(ArticleList response) {
Log.d("rest", "onSuccess!!!");
}
@Override
public void onFailure(RetrofitError error) {
Log.d("rest", "onFailure!!!");
}
}
}
- RetroFit用のinterface
RetroFitApi.java
/**
* 各APIのテンプレートをこのinterfaceに集約させる
*/
public interface RetroFitApi {
/**
* アノテーションでGET/POST/PUT/DELETEを指定。
* カッコ内はリクエストのホスト部以降を指定。
*
* 戻り型をvoidとすることで勝手に別スレッドで通信処理を行ってくれる。
*
* メソッドの引数とアノテーションの組み合わせで
* リクエストパラメータを生成する。
* 下記の例では?name="hoge"が付与される
*
* コールバックにPOJOのオブジェクトを指定するとPOJO変換してくれる。
*/
@GET("/news/new")
void getNew(@Query("name") String name, Callback<ArticleList> cb);
}
- ObserverパターンのSubject部
RequestCallback.java
/**
* REST通信のコールバック
*/
public class RequestCallback<T> implements Callback<T> {
private RequestListener<T> mListener;
public RequestCallback(RequestListener<T> listener){
mListener = listener;
}
// 正常終了時に呼ばれる
@Override
public void success(T object, Response response){
mListener.onSuccess(object);
}
// 異常終了時に呼ばれる
@Override
public void failure(RetrofitError error){
mListener.onFailure(error);
}
}
- ObserverパターンのObserver部
RequestListener.java
/**
* REST通信のコールバックに利用するinterface
*/
public abstract interface RequestListener<T> {
void onSuccess(T response);
void onFailure(RetrofitError error);
}
- jsonscheme2pojoで自動生成したPOJOファイル。
Article.java
public class Article {
// 省略
}
ArticleList.java
public class ArticleList {
// 省略
}