Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@moto

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

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を触りました。
正直、今回のようなアプリだとその良さを体感するまでには至っていないため、
もう少し使ってみて中身のある記事を投稿します。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?