どうも。どっことです。今回は、Retrofit
を使った情報取得する実装について解説します。
Retrofitを使った通信処理の実装
他の言語ではいくつか紹介していましたが、そもそもAndroidを紹介していないことに気づきました。そんなわけで今回は、Androidのデファクトスタンダードの一つとなっているRetrofit
というライブラリを使った通信処理の実装を解説します。
実装手順
以下の手順で実装していきます。
build.gradle
にライブラリを追加AndroidManifest.xm
に通信するパーミッションを追加Retrofit
による通信処理の実装1- 通信するためのIFと、レスポンスデータクラスを追加
Retrofit
による通信処理の実装2
順に解説していきます。
build.gradleにライブラリを追加
まずはbuild.gradle
のdependencies
に以下を追加します。
dependencies {
// moshiライブラリ。Jsonをデータオブジェクトに変換してくれる。
implementation("com.squareup.moshi:moshi-kotlin:1.15.1")
// retrofitライブラリ。通信処理してくれるライブラリ。
implementation("com.squareup.retrofit2:retrofit:2.11.0")
// moshi-converter。 retrofit で moshi をいい感じに使ってくれるためのもの。
implementation("com.squareup.retrofit2:converter-moshi:2.11.0")
}
AndroidManifest.xmに通信するパーミッションを追加
アプリ上で外部通信する場合、AndroidManifest.xml
にパーミッションの宣言が必要です。
以下を追加します。
<uses-permission android:name="android.permission.INTERNET" />
Retrofitによる通信処理の実装1
今回利用するAPIとして、サンプルAPIを公開している以下を利用させていただきました。
まずは実際に通信処理をするインスタンスを作るため、Retrofit
のインスタンスを生成しましょう。
val retrofit = Retrofit.Builder()
.baseUrl("https://api.sampleapis.com")
.addConverterFactory(
MoshiConverterFactory.create(
Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
)
.build()
-
baseUrl
は接続先URLのドメインを指定します。パスは後述するインターフェース側に記載します。 -
addConverterFactory
は、通信結果により取得したJsonを解析させるためのライブラリを指定します。今回はMoshi
ライブラリを指定しています。
用意したretrofit
オブジェクトは後ほど利用します。
通信するためのIFと、レスポンスデータクラスを追加
通信するためのインターフェースと、レスポンスデータクラスを追加します。
インターフェースはメソッド(@GET
)やretrofit
オブジェクトのドメインからのパス(/coffee/hot
)を指定し、レスポンスとしてどのようなデータを返却してもらうかを定義します。
interface ApiInterface {
@GET("/coffee/hot")
fun hotCoffee(): Call<List<Coffee>>
}
またレスポンスデータとしてCoffee
クラスのリストを定義します。今回は簡単のため、title
だけを解析対象としてデータ定義します。
data class Coffee(val title: String)
他のデータも取得したい場合は、対応するものをメンバ変数に定義すれば解析してくれます。
Retrofitによる通信処理の実装2
先ほど追加したインターフェースを渡して、実際に通信処理してくれるインスタンスを生成しましょう。
val api = retrofit.create(ApiInterface::class.java)
あとは、生成したインスタンスで通信処理を依頼します。enqueue()
メソッドで通信処理を非同期に依頼します。
api.hotCoffee().enqueue(object : Callback<List<Coffee>> {
override fun onResponse(p0: Call<List<Coffee>>, response: Response<List<Coffee>>) {
Log.d("RetrofitActivity", "response.isSuccessful:${response.isSuccessful}")
Log.d("RetrofitActivity", "response.code:${response.code()}")
Log.d("RetrofitActivity", "response.message:${response.message()}")
Log.d("RetrofitActivity", "response.raw:${response.raw()}")
Log.d("RetrofitActivity", "response.body:${response.body()}")
}
override fun onFailure(p0: Call<List<Coffee>>, error: Throwable) {
// エラーハンドリング
Log.w("RetrofitActivity", "onFailure", error)
}
})
なお同じ通信処理の依頼でexecute()
というメソッドがありますが、こちらは同期的に通信処理を依頼します。Androidではメインスレッドで通信処理を実施するとクラッシュしてしまうので、利用するタイミングの検討が必要となります。
まとめ
今回は、Retrofit
を使った情報取得する実装について解説しました。通信処理による情報取得・送信はモバイルアプリでは必須な機能となるので、ぜひ参考にしてくださいね。