Posted at
AndroidDay 8

Repositoryパターンにおけるfetchタイミング制御

この記事はAndroid Advent Calendar 2018 12/8の記事です。

みなさん、アーキテクチャ、考えてますか?そうですよね、楽しいですよね!(?)

知らぬ間にGuide to app architectureというページが作られていました。

MVVMの記事は溢れているので、今回はGoogleのサンプルコードを用いて

Repositoryパターンにおけるfetchタイミング制御の方法を紹介します!


RateLimiterクラス

googlesamples/android-architecture-componentsGithubBrowserSampleでは

キャッシュ時間制御のためにRateLimiterというUtilityクラスが定義されています。

実装は非常に簡素なものになっていて、RepositoryはRateLimiter#shouldFetchを呼び出し、

fetchをすべきかローカルから値をすべきかを判断し、ふさわしい処理をします。

サンプルのRepositoryではNetworkBoundResourceクラスで、ふさわしい処理を

よしなにやっていますが、今回はそこは説明しません。


shouldFetchメソッド

メソッドだけ切り出すと、


RateLimiter.kt

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を設定できるので便利ですね。

このタイムアウト時間は生成時に、


RateLimiter.kt

class RateLimiter<in KEY>(timeout: Int, timeUnit: TimeUnit) {

private val timestamps = ArrayMap<KEY, Long>()
private val timeout = timeUnit.toMillis(timeout.toLong())

// メソッド省略
...
}


と設定できます。わかりやすいですね。

Repositoryはこれをプロパティに持ってあげてタイムアウト時間をセットするのみです。


まとめ

Googleのサンプルは参考にできるコードの宝庫ですね!!!