この記事はAndroid Advent Calendar 2018 12/8の記事です。
みなさん、アーキテクチャ、考えてますか?そうですよね、楽しいですよね!(?)
知らぬ間にGuide to app architectureというページが作られていました。
MVVMの記事は溢れているので、今回はGoogleのサンプルコードを用いて
Repositoryパターンにおけるfetchタイミング制御の方法を紹介します!
RateLimiterクラス
googlesamples/android-architecture-componentsのGithubBrowserSampleでは
キャッシュ時間制御のためにRateLimiter
というUtilityクラスが定義されています。
実装は非常に簡素なものになっていて、RepositoryはRateLimiter#shouldFetch
を呼び出し、
fetchをすべきかローカルから値をすべきかを判断し、ふさわしい処理をします。
サンプルのRepositoryではNetworkBoundResource
クラスで、ふさわしい処理を
よしなにやっていますが、今回はそこは説明しません。
shouldFetchメソッド
メソッドだけ切り出すと、
fun shouldFetch(key: KEY): Boolean {
val lastFetched = timestamps[key]
val now = now()
if (lastFetched == null) {
timestamps[key] = now
return true
}
if (now - lastFetched > timeout) {
timestamps[key] = now
return true
}
return false
}
こんな感じです。単純ですね。
あるキーに対して、最後にfetchした時間と今の時間の差異を出します。
それがtimeoutの時間を超えていればtrue、そうでなければfalseを返すわけです。
キー毎にlastFetchedを設定できるので便利ですね。
このタイムアウト時間は生成時に、
class RateLimiter<in KEY>(timeout: Int, timeUnit: TimeUnit) {
private val timestamps = ArrayMap<KEY, Long>()
private val timeout = timeUnit.toMillis(timeout.toLong())
// メソッド省略
...
}
と設定できます。わかりやすいですね。
Repositoryはこれをプロパティに持ってあげてタイムアウト時間をセットするのみです。
まとめ
Googleのサンプルは参考にできるコードの宝庫ですね!!!