Kuwapp's Blog

Android と Flutter やってます

Retrofitを使って天気情報を取得してみる【Android】

RESTライブラリ「Retrofit」が便利そうなので実際に使ってみました。

square.github.io

OpenWeatherMap current weather and forecastAPIを使用して天気情報を取ってこようと思います。
今回は緯度と経度を指定できる次の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に上げています。

github.com

参考

Android Tutorial: Retrofit Android Tutorial

JSON - 天気情報を取得する - Qiita

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