Android Kotlin基礎講座 09.1:レポジトリー

タスク:スターターコードのセットアップと概要

このタスクでは、DevBytesアプリ用のスターターコードをダウンロードし、中身を調べていきます。

ステップ1:スターターアプリをダウンロードして起動する

  1. DevBytes starterをGitHubからダウンロードしてください。
  2. コードを解凍し、Android Studioでプロジェクトを開いてください。
  3. 実機、またはエミュレーターがインターネットに接続されていない場合は接続してください。アプリをビルドして起動してください。アプリはDevByteの動画をネットワークから取得し、画面に表示します。
  4. アプリ内で、どれでもいいので動画をクリックし、YouTubeで開いてください。
  5. 実機、またはエミュレーターの機内モードをONにしてください。
  6. アプリをもう一度起動してください。ネットワークエラートーストメッセージが表示されることを確認してください。

機内モードがオフで、インターネット接続が遅い場合は回転する進捗バーが表示されます。もし進捗バーが表示されない場合は、次のステップでネットワーク遅延をプログラム的に追加します。これによって、ユーザーにとって接続が遅いときのアプリの感覚がどのようなものなのか、またオフラインキャッシングがアプリにとって重要な理由を知ることができます。

ステップ2(任意):ネットワーク遅延をシミュレートする

もしインターネット接続が良好で進捗バーを確認することができない場合は、delay()関数を使ってネットワークレスポンスの遅延をシミュレートすることができます。

  1. 実機、またはエミュレーターの機内モードがオフであることを確認してください。
  2. DevByteViewModel内のrefreshDataFromnetwork()内、catchブロックの最初で2秒の遅延を追加します。この遅延コードはネットワークエラーのセッティングを遅らせます。
private fun refreshDataFromNetwork() = viewModelScope.launch {

   try {
        ...
   } catch (networkError: IOException) {
       delay(2000)
       // Show a Toast error message and hide the progress bar.
       _eventNetworkError.value = true
   }
}
  1. アプリをもう一度起動してください。読み込み中のスピナーとネットワークエラーメッセージが表示されます。読み込み中のスピナーはユーザーのネットワーク接続が遅い際に表示されるものです。オフラインキャッシングを実装したあとは、このユーザーエクスペリエンスは改善されます。
  1. ただいま追加した遅延コード、delay(2000)を削除してください。

ステップ3:コードを調べる

このスターターアプリにはアプリのレポジトリモジュールにフォーカスを当てられるように、事前にネットワーク関連およびUI関連のモジュールのコードが付属しています。

  1. Android Studioで全てのパッケージを展開してください。
  2. domainパッケージから見ていきます。このパッケージにはアプリのデータを表すdataクラス群が含まれています。例として、domain/Models.ktクラスのDevByteVideoデータクラスは単体のDevByte動画を表しています。
  3. 次にnetworkパッケージを見ていきます。

network/DataTransferObjects.ktクラスにはNetworkVideoというデータトランスファーオブジェクト用のデータクラスが含まれています。データトランスファーオブジェクトはネットワークリザルトをパースするために使われます。またこのファイルにはasDomainModel()という、ネットワークリザルトをドメインオブジェクトのリストに変換するための便利なメソッドも含まれています。
データトランスファーオブジェクトはドメインオブジェクトとは異なり、ネットワークリザルトをパースするためのロジックが含まれています。

Tip: network、domain、database、それぞれのオブジェクトを分けるのはベストプラクティスと言えます。この手法は関心の分離という原理に則っています。ネットワークレスポンスやデータベーススキームに変化があった場合、アプリのコード全体を更新することなく、アプリのコンポーネントを変更・管理できるといった利点があります。

  1. 自身でスターターコードの他の部分も調べてみるといいでしょう。

他のアプリのアーキテクチャは以前の記事で作成したアプリで使ったものと共通です。

  • network/Service.ktのRetrofitサービスがネットワークからdevbytesプレイリストを読み込みます。
  • DevByteViewModelはアプリのデータをLiveDataオブジェクトとして保持します。
  • UI controllerであるDevByteFragmentには動画のリストを表示するRecyclerViewとLiveDataオブジェクト用のオブザーバーが含まれています。