あなたの改善要求はどんな問題に関連していますか?
通信ライブラリ+converterを利用することで簡単に通信処理を書いてみましょう
解決目的
Retrofitを利用することで非同期処理周りが見やすくかつ簡単に実装が可能になります。
業務で使うことも多いと思うので、対応した場合どんな感じになるか確認してみましょう
検討した代替案
- Retofit
通信リクエストの組み立てや処理のハンドリングが容易に行えるようになります
- Gson
レスポンスの型に相当するDataClassを定義しておくことでResponseをそのクラスに直接変換ができます
build.gradle
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
ReposRemoteDataSource.kt
fun requestByRetrofit(callback: ReposDataSource.LoadReposCallback) {
val retrofit =
Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()) // <- 変換処理実行設定はここだけ。通信の基本URLもここで設定
.build()
val client = retrofit.create(GitHubRequest::class.java)
client.getRepository("Neos21").enqueue(object : Callback<List<RepositoryData>> {
override fun onFailure(call: Call<List<RepositoryData>>, t: Throwable) {
// TODO エラー時の処理
}
override fun onResponse(call: Call<List<RepositoryData>>, response: Response<List<RepositoryData>>) {
val result = response.body()
result?.let {
// いったんコード用のRepository型にparseします
// Repository(var title:String, var url: String?, var readmeURL: String)
callback.onReposLoaded(it.map { repository ->
Repository(repository.name, repository.html_url, repository.getReadMeUrl())
})
}
}
})
}
// レスポンスデータを格納するクラス
data class RepositoryData(
val name: String,
val html_url: String,
val id: String,
val description: String
) {
fun getReadMeUrl() = "$html_url/blob/master/README.md"
}
interface GitHubRequest {
@GET("users/{user_name}/repos") // <- 通信先のEndpointの設定。URLパラメータも引数から与えられる
fun getRepository(@Path("user_name") userName: String): Call<List<RepositoryData>>
}
補足
モバイルアプリ開発では様々なライブラリが提供されているので、それらを利用することで効率的な開発ができます😀
あなたの改善要求はどんな問題に関連していますか?
通信ライブラリ+converterを利用することで簡単に通信処理を書いてみましょう
解決目的
Retrofitを利用することで非同期処理周りが見やすくかつ簡単に実装が可能になります。
業務で使うことも多いと思うので、対応した場合どんな感じになるか確認してみましょう
検討した代替案
通信リクエストの組み立てや処理のハンドリングが容易に行えるようになります
レスポンスの型に相当するDataClassを定義しておくことでResponseをそのクラスに直接変換ができます
build.gradle
ReposRemoteDataSource.kt
補足
モバイルアプリ開発では様々なライブラリが提供されているので、それらを利用することで効率的な開発ができます😀