ラベル Retrofit の投稿を表示しています。 すべての投稿を表示
ラベル Retrofit の投稿を表示しています。 すべての投稿を表示

2024年5月7日火曜日

Android Retrofitを使った情報取得する実装を解説

どうも。どっことです。今回は、Retrofitを使った情報取得する実装について解説します。

Retrofitを使った通信処理の実装

他の言語ではいくつか紹介していましたが、そもそもAndroidを紹介していないことに気づきました。そんなわけで今回は、Androidのデファクトスタンダードの一つとなっているRetrofitというライブラリを使った通信処理の実装を解説します。

実装手順

以下の手順で実装していきます。

  • build.gradleにライブラリを追加
  • AndroidManifest.xmに通信するパーミッションを追加
  • Retrofitによる通信処理の実装1
  • 通信するためのIFと、レスポンスデータクラスを追加
  • Retrofitによる通信処理の実装2

順に解説していきます。

build.gradleにライブラリを追加

まずはbuild.gradledependenciesに以下を追加します。

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を使った情報取得する実装について解説しました。通信処理による情報取得・送信はモバイルアプリでは必須な機能となるので、ぜひ参考にしてくださいね。

参考

移行予定

どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。