search
LoginSignup
165

More than 5 years have passed since last update.

posted at

RetroFitでAndroidのREST通信&JSON変換を幸せにする

RetroFitって何?

AndroidのREST通信を簡潔にし、POJO変換もしてくれるライブラリ。

AsyncLoaderだのjsonObjectだのに振り回されなくて済むので非常にありがたいです。

Retrofitの導入

  • gradleに以下追記

※最新バージョンは公式参照の事

app/build.gradle
dependencies {
    // 以下追記
    compile 'com.squareup.retrofit:retrofit:1.6.1'
}

レスポンス用のオブジェクトを生成

  • jsonschema2pojoを利用してjsonから生成

※基本的には、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 {
    // 省略
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
165