Android Kotlin基礎講座 08.1:インターネットからデータを取得する

Android Kotlin基礎講座

タスク:Retrofitでコルーチンを使う

現在Retrofit APIサービスは機能していますが、実装しなければならない二つのコールバックメソッドを含む一つのコールバックを使っています。一つのメソッドは成功した場合の処理、もう一つは失敗した場合の処理をし、失敗結果は例外を報告します。コールバックを使う代わりに、コールバックを用いて例外処理を行えば、現在のコードはより効率性、および可読性が向上します。
このタスクでは、ネットワークサービスとViewModelをコルーチンを使えるように変換していきます。

ステップ1:MarsApiServiceとOverviewViewModelを更新する

  1. MarsApiServiceの中のgetProperties()をsuspend関数にしてください。
    Call<List<MarsProperty>>をList<MarsProperty>にしてください。
    getProperties()メソッドは以下のようになります。
@GET("realestate")
suspend fun getProperties(): List<MarsProperty>
  1. OverviewViewModel.ktファイルのgetMarsRealEstateProperties()中のコードを全て削除してください。ここでenqueue()、onFailure()およびonResponse()の代わりにコルーチンを使用します。
  2. getMarsRealEestateProperties()の中で、viewModelScopeを使ってコルーチンを起動してください
viewModelScope.launch { 

}

ViewModelScopeはアプリのそれぞれのViewModel用に定義された組み込みコルーチンスコープです。このスコープで起動されたコルーチンは全てViewModelがクリアされた時点で自動でキャンセルされます。

  1. launchブロック中に、try/catchブロックを追加して例外処理ができるようにしてください。
try {

} catch (e: Exception) {
  
}
  1. tryブロックの中で、retrofitServiceオブジェクト上でgetProperties()を呼び出してください。
val listResult = MarsApi.retrofitService.getProperties()

getProperties(9をMarsApiサービスから呼び出すことで、バックグラウンドスレッドでネットワークの呼び出しが作成、および開始されます。

  1. さらに、tryブロックの中で、成功結果の場合のメッセージを更新してください。
_response.value = 
   "Success: ${listResult.size} Mars properties retrieved"
  1. 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}"
       }
   }
}
  1. コンパイルしてアプリを起動してください。前回のタスクの時と同じ結果が得られますが、より簡単なコードとエラー処理を行っています。

完成済みプロジェクト

お疲れさまでした。完成済みプロジェクトは以下からダウンロードできます。

MarsRealEstateNetwork

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました