Retrofitを使って天気情報を取得してみる【Android】
RESTライブラリ「Retrofit」が便利そうなので実際に使ってみました。
OpenWeatherMap current weather and forecastのAPIを使用して天気情報を取ってこようと思います。
今回は緯度と経度を指定できる次のAPIを使用します。
http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139
プロジェクトにRetrofitを取り込む
build.gradleのdependenciesに以下を追加し、SyncProjectWithGradleFilesを実行します。
compile 'com.squareup.retrofit:retrofit:1.9.0'
AndroidManifestにパーミッションを追加する
インターネット接続を使用するのでAndroidManifest.xmlに以下を追加します。
<uses-permission android:name="android.permission.INTERNET"/>
POJOを作成し追加する
取得したJsonの天気情報を格納するためのPOJOを作成します。
今回は以下にアクセスしてJsonを取得するため、このJsonに対応したPOJO作成します。
http://api.openweathermap.org/data/2.5/weather?lat=35.681382&lon=139.766084
POJOの作成にはjsonschema2pojoが便利です。
先ほどのURLにアクセスし表示されるJsonをjsonschema2pojoに貼り付けPreviewを押すとPOJOが生成されます。
また、Source typeはJsonにAnnotation styleはGsonにチェックを入れておきます。
これらをコピーしクラスを作成してプロジェクトに追加します。
APIにアクセスするためのインターフェースを作成する
今回はGET通信なのでアノテーションの@GETを使用します。かっこ内はリクエストのホスト部以降を記述します。
引数は次のように指定すると自動でweather?lat=(lat)&lon=(lon)のようなリクエストを生成してくれます。
public interface WeatherApi { @GET("/weather") public void getWeather(@Query("lat") float lat, @Query("lon") float lon, Callback<WeatherData> response); }
天気情報を取得する
RestAdapterのインスタンスを生成しcreateメソッドでWeatherApiのインスタンスを生成します。
あとは天気情報を取得するgetWeatherメソッドを呼ぶだけです。
通信に成功するとCallback内のsuccessメソッドが呼ばれ、その引数に受け取ったJsonのデータが渡されます。。
private static final String API = "http://api.openweathermap.org/data/2.5"; private static final float LAT = 35.681382f; private static final float LON = 139.766084f; RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(API) .build(); WeatherApi api = adapter.create(WeatherApi.class); api.getWeather(LAT, LON, new Callback<WeatherData>() { @Override public void success(WeatherData weatherData, Response response) { for (Weather w : weatherData.getWeather()) { System.out.println("Weather Description : " + w.getDescription()); } } @Override public void failure(RetrofitError error) { } });
以上です
今回使用したすべてのコードはGithubに上げています。