Android Kotlin基礎講座 08.1:インターネットからデータを取得する
目次
タスク:Retrofitでコルーチンを使う
現在Retrofit APIサービスは機能していますが、実装しなければならない二つのコールバックメソッドを含む一つのコールバックを使っています。一つのメソッドは成功した場合の処理、もう一つは失敗した場合の処理をし、失敗結果は例外を報告します。コールバックを使う代わりに、コールバックを用いて例外処理を行えば、現在のコードはより効率性、および可読性が向上します。
このタスクでは、ネットワークサービスとViewModelをコルーチンを使えるように変換していきます。
ステップ1:MarsApiServiceとOverviewViewModelを更新する
- MarsApiServiceの中のgetProperties()をsuspend関数にしてください。
Call<List<MarsProperty>>をList<MarsProperty>にしてください。
getProperties()メソッドは以下のようになります。
@GET("realestate")
suspend fun getProperties(): List<MarsProperty>
- OverviewViewModel.ktファイルのgetMarsRealEstateProperties()中のコードを全て削除してください。ここでenqueue()、onFailure()およびonResponse()の代わりにコルーチンを使用します。
- getMarsRealEestateProperties()の中で、viewModelScopeを使ってコルーチンを起動してください
viewModelScope.launch {
}
ViewModelScopeはアプリのそれぞれのViewModel用に定義された組み込みコルーチンスコープです。このスコープで起動されたコルーチンは全てViewModelがクリアされた時点で自動でキャンセルされます。
- launchブロック中に、try/catchブロックを追加して例外処理ができるようにしてください。
try {
} catch (e: Exception) {
}
- tryブロックの中で、retrofitServiceオブジェクト上でgetProperties()を呼び出してください。
val listResult = MarsApi.retrofitService.getProperties()
getProperties(9をMarsApiサービスから呼び出すことで、バックグラウンドスレッドでネットワークの呼び出しが作成、および開始されます。
- さらに、tryブロックの中で、成功結果の場合のメッセージを更新してください。
_response.value =
"Success: ${listResult.size} Mars properties retrieved"
- catchブロック中で失敗した場合の処理を行います。
_response.value = "Failure: ${e.message}"
最終的なgetMarsRealEstateProperties()メソッドは以下のようになります。
private fun getMarsRealEstateProperties() {
viewModelScope.launch {
try {
val listResult = MarsApi.retrofitService.getProperties()
_response.value = "Success: ${listResult.size} Mars properties retrieved"
} catch (e: Exception) {
_response.value = "Failure: ${e.message}"
}
}
}
- コンパイルしてアプリを起動してください。前回のタスクの時と同じ結果が得られますが、より簡単なコードとエラー処理を行っています。
完成済みプロジェクト
お疲れさまでした。完成済みプロジェクトは以下からダウンロードできます。