9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidAdvent Calendar 2018

Day 8

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

Posted at

この記事は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のサンプルは参考にできるコードの宝庫ですね!!!

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?