DEV

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());
}
});
}
}