edo1z blog

プログラミングなどに関するブログです

Android - Retrofit

Retrofitも使ってみる。なんか一番人気がありそう。REST APIに対して使いやすい感じっぽい。

設定

build.gradleに下記を設定する。

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

使い方

参考: Android:Retrofit2.0ではてなAPIとおしゃべりしてみた Retrofit2 &OkHttpでAndroidのHTTP通信が快適だにゃん

なんか思ってたのと違う。近代的だ。すっきりするからいい感じな気がする。でも色々ブラックボックス化してるから、エラーのときとかイライラする可能性はあるかもなあと思った。

コードサンプル

APIにアクセスすると、itemの配列がjsonデータでもらえるようになっている。itemは、id、name、price、descriptionというフィールドがある。 URLを、https://hoge.com/items/index.jsonとすると、返ってくるのは、[{id:1, name:たまご...}, {}]みたいなJSONデータ。

まずは、モデルクラスをつくる

モデルクラス

item.java

package com.logicky.json.data;

public class Item {
    public String name;
    public Integer price;
    public String description;
}

Interface

次に、APIのURL毎に対応する関数が羅列されているインターフェースをつくる

MyApiInterface.java

package com.logicky.json;

import com.logicky.json.data.Item;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;

public interface MyApiInterface {
    String END_POINT = "https://hoge.com";

    @GET("items/index.json")
    Call<List<Item>> getItems();
}

Activity

package com.logicky.json;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.logicky.json.data.Item;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {
    private MyApiInterface myapi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(MyApiInterface.END_POINT)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        myapi = retrofit.create(MyApiInterface.class);
        getItems();
    }

    private void getItems() {
        Log.d("TEST", "getItems");
        Call<List<Item>> call = myapi.getItems();
        call.enqueue(new Callback<List<Item>>() {
            @Override
            public void onResponse(Call<List<Item>> call, Response<List<Item>> response) {
                Log.d("TEST", "getItems Response");
                List<Item> items = response.body();
                Log.d("TEST", items.get(0).name);
            }

            @Override
            public void onFailure(Call<List<Item>> call, Throwable t) {
                Log.d("TEST", "getItems Failure");
                Log.d("TEST", t.getMessage());
            }
        });

    }

}