2
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.

GraphQLAdvent Calendar 2017

Day 13

Apollo-androidのレスポンスキャッシュを使ってみる

Last updated at Posted at 2017-12-14

Apollo-android

GraphQLのAndroid用クライアントライブラリであるApollo-androidの導入手順を書こうかと思ったのですが、
こちらの方の記事がとても詳しいので、今回はApollo-androidでCacheの利用する際の手順について書きます。

今回のソースは、下記になります。Kotlin1.2.0で書いています。
https://github.com/moto2011/apollo-android-sample

Cache

Apollo-androidの導入自体は上の記事を参考に行って下さい。
以降は、導入自体は完了している前提となります。

レスポンスのキャッシュは以下の3つがあるようです。今回はHTTP Response Cacheを利用してみます。

  1. HTTP Response Cache
  2. Normalized Disk Cache
  3. Normalized InMemory

1. dependencies追加

公式のREADMEの通りです。Cacheを利用する場合dependenciesに以下を追記します。

build.gradle
dependencies {
    implementation 'com.apollographql.apollo:apollo-http-cache:0.4.3'
}

2. ApolloClientの作成

公式のREADMEでは.httpCache(new HttpCache(cacheStore))となっていますが、
HttpCacheはcacheStoreを引数にとるコンストラクタがないとかエラーが出たので、ApolloHttpCache の方を使いました。

MainActivity.kt
// Cache
val size = 1024L * 1024L
val cacheStore = DiskLruHttpCacheStore(cacheDir, size)

// Build the Apollo Client
apolloClient = ApolloClient.builder()
        .serverUrl("https://api.github.com/graphql")
        .httpCache(ApolloHttpCache(cacheStore)) // HttpCacheではなくApolloHttpCache
        .okHttpClient(client)
        .build()

3. HttpCachePolicyの設定

以下のの4つがあるようですが、今回はCACHE_FIRST(キャッシュがあればそれを使い、キャッシュがなければ通信)を指定して有効期限も設定します。

  1. CACHE_ONLY
  2. NETWORK_ONLY
  3. CACHE_FIRST
  4. NETWORK_FIRST
MainActivity.kt
apolloClient.query(ViewerQuery())
        .httpCachePolicy(HttpCachePolicy.CACHE_FIRST.expireAfter(20, TimeUnit.MINUTES)) // ポリシーの設定
        .enqueue(object : ApolloCall.Callback<ViewerQuery.Data>() {
            override fun onResponse(response: Response<ViewerQuery.Data>) {
                c.resume((response.data() as ViewerQuery.Data).viewer.login)
            }

            override fun onFailure(e: ApolloException) {
                c.resume("Error!!")
                e.printStackTrace()
            }
        })

4. 動作確認

画面中央のボタンタップで、githubのユーザ名を表示するだけのアプリです。

まず通信出来る状態でボタンをタップするとユーザ名が表示されます。
そのあとタスクキルなどして機内モード等でオフライン状態にしたのちに再度アプリを起動・ボタンをタップすると
前回通信時のレスポンスキャッシュがあるため下記の通り、ユーザ名が表示されます。

終わりに

今回、この記事を書くにあたってはじめてGraphQLを触りました。
正直、今回のようなアプリだとその良さを体感するまでには至っていないため、
もう少し使ってみて中身のある記事を投稿します。。

2
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
2
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?