元に翻訳・加筆したものです。詳しくは元記事をご覧ください。アプリに値を読み込む最善策を紹介した動画が公開されたことをご存じかもしれません。動画を見るより記事を読みたい方もいるでしょう。そこで、この内容を便利なブログ形式でもご紹介します。つのステップで行われることをご存じでしょう。さまざまな既定値を設定します。ファイルから値を取り込むことで、端末上でローカルに設定されます。呼び出して新しい値をクラウドからダウンロードします。呼び出し、最初に設定された既定値に対してダウンロードした値を適用します。特定の値を問い合わせると、クラウドからアップデートされた値か、ローカルに設定されている既定値のどちらかが取得されます。これはすばらしい動作です。経由で取得できるようになるからです。既定値とは異なる値のみがダウンロードされるため、ネットワークの呼び出しは適切かつ最小限に抑えることができます。アプリのあらゆる動作を後からクラウド経由で変更できるという柔軟性が得られます。簡単だと思いませんか。基本的には、そのとおりです。ここではネットワークの呼び出しが必要になりますが、現実の世界では、トンネル、エレベーター、砂漠などのネットワーク接続が不安定な場所でアプリを使う人々がいます。そのため、ネットワークの呼び出しが完了するまでにどのくらい時間がかかるかは予想できません。ユーザーがアプリを使い始める前にこのプロセスが完了することは保証されません。つの戦略が考えられます。反映して更新これはもっとも単純な戦略です。そのため、サンプルアプリやチュートリアルでは、一般的にこの方法が使われています。呼び出し、それをすぐに反映させてから、アプリをアップデートして処理を続けます。この戦略が優れているのは、ユーザーがすぐにアプリを使い始めることができる点です。配置などの重要な値が変更されるのは違和感があるでしょう。エクスペリエンスの低下につながるかもしれません。そのため、多くのデベロッパーは次のようなソリューションを選ぶ傾向にあります。ロード中画面の追加よく使われる戦略として、ユーザーがアプリを開始した際にロード中画面を表示する方法があります。コンテンツに遷移します。ロード中画面が終わってアプリに入ると、すべてがうまくいっているように見えます。ほとんどの場合、クラウドから最新の値がダウンロードされ、アプリがそれを使う準備も完了していることが保証されます。この方式の明らかに大きな欠点は、ロード中画面が追加されたことです。開発にかかる時間や手間もさることながら、ユーザーがアプリに入る際の壁になります。アプリにロード中画面があり、開始時に他の作業やネットワークの呼び出しを行っているのであれば、これは優れた戦略となるでしょう。アプリにまだロード中画面がない場合は、別の戦略を試してみることをお勧めします。値を読み込み、次回に反映これはあまり直感的ではないかもしれませんが、ぜひお読みください。すると、クラウドから取得した前回の値が適用されます。ユーザーはすぐにアプリを使い始めることができます。呼び出してクラウドから新しい値を取得します。完了ハンドラでは、何もしません。そもそも、完了ハンドラを追加する必要すらありません。呼び出すまで、端末のローカルに保存されたままになります。これは、ユーザーがすぐにアプリを使い始めることができる優れた戦略で、アプリのインターフェースが突然変わったりするような奇妙な動作も起こりません。セッションが必要になることです。この動作がアプリにふさわしいかどうかは、ご自身で判断してください。使うような場合は、おそらく問題ないでしょう。日ごとにメッセージを送信したり、日付に固有のコンテンツを提供したりする場合(アプリのスキンを休日用に変更するなど)にはふさわしくないかもしれません。呼び出しが成功したのはいつなのかがわかることです。データの最終取得日時を最初に確認するという中間戦略をとることができます。時間以内など)であれば、そのまま先に進み、「前回取得した値を適用して、次回のために値を取得する」戦略をとることができます。つの戦略のうちどちらかを実行します。キャッシュについてここまで読み込み戦略の話をしてきたので、関連するキャッシュの話題に進みましょう。時間キャッシュされます。この点を勘違いしているデベロッパーもいるようです。サービスによる制限がアプリに適用されることもあります。そもそもなぜこのようなキャッシュや制限の仕組みが存在しているのでしょうか。何百万というユーザーが使うアプリがあっても、確実にこの無償サービスを維持できるようにするためです。適切に動作するキャッシュの仕組みが追加されているので、アプリがどんなに有名になったとしても、このサービスを無償で利用できることが保証されています。この仕組みは質の悪いコードからサービスを守る方法としても有効です。何度も呼び出すようなデベロッパーもいます(もちろん、皆さんのことではありません)。行ったとしても、サービス全体が影響を受けないようにする必要があります。クライアント側のライブラリでキャッシュされた値を提供したり、頻繁に行われるネットワークの呼び出しを制限したりすれば、安全にサービスを維持できます。これは、ユーザーにとってもメリットになります。優れたキャッシュ戦略があれば、アプリから不要なネットワークの呼び出しを何度も行ってユーザーの電池やデータプランを使い果たすようなことはなくなります。そのため、優れたキャッシュ戦略は常に実装すべきものです。実装の開発やテストの際に、この動作を不便に感じることがあるでしょう。モードをオンにしてローカルでの制限動作を無視できるようになっています。実際には、たとえユーザーが毎日アプリを使ったとしても、通常、こういったキャッシュ動作はメリットだけをもたらします。頻繁に値をプッシュしたい場合はどうすればよいでしょうか。「時間ごとのメッセージ」のような機能を提供したいような場合です。サービスが適切なソリューションではないことの表れかもしれません。利用を検討するとよいでしょう。アップデートを大至急適用したい場合もあるかもしれません。前回の変更で意図せずにアプリ内の秩序を乱してしまった場合や、ただちに新しい値を全員に適用したい場合などが考えられます。キャッシュを回避してクライアントに値の取得を強制させるには、どうすればよいでしょうか。使うと、すべての端末にデータのみの通知を送り、保留されている緊急アップデートについて知らせることができます。この通知を受信したアプリは、なんらかのフラグをローカルに保存します。完了時には、忘れずにフラグをクリアして通常のキャッシュ動作に戻すようにしてください。サービスから新しい値を取得させたくなるかもしれませんが、インストールされたすべてのアプリが一斉にこれを行うと、サーバー側の制限の対象になる可能性が高くなります。そのため、このような動作をさせるのではなく、前述の戦略を使用します。することで、すべてのユーザーがアプリを開くまでの期間、ネットワークの呼び出しを分散させることができます。値を読み込む際のちょっとしたテクニックについて紹介しました。動画のコメントでぜひ共有してください。実装しているかをお知らせください。元に翻訳・加筆したものです。詳しくは元記事をご覧ください。アプリに値を読み込む最善策を紹介した動画が公開されたことをご存じかもしれません。動画を見るより記事を読みたい方もいるでしょう。そこで、この内容を便利なブログ形式でもご紹介します。つのステップで行われることをご存じでしょう。さまざまな既定値を設定します。ファイルから値を取り込むことで、端末上でローカルに設定されます。呼び出して新しい値をクラウドからダウンロードします。呼び出し、最初に設定された既定値に対してダウンロードした値を適用します。特定の値を問い合わせると、クラウドからアップデートされた値か、ローカルに設定されている既定値のどちらかが取得されます。これはすばらしい動作です。経由で取得できるようになるからです。既定値とは異なる値のみがダウンロードされるため、ネットワークの呼び出しは適切かつ最小限に抑えることができます。アプリのあらゆる動作を後からクラウド経由で変更できるという柔軟性が得られます。簡単だと思いませんか。基本的には、そのとおりです。ここではネットワークの呼び出しが必要になりますが、現実の世界では、トンネル、エレベーター、砂漠などのネットワーク接続が不安定な場所でアプリを使う人々がいます。そのため、ネットワークの呼び出しが完了するまでにどのくらい時間がかかるかは予想できません。ユーザーがアプリを使い始める前にこのプロセスが完了することは保証されません。つの戦略が考えられます。反映して更新これはもっとも単純な戦略です。そのため、サンプルアプリやチュートリアルでは、一般的にこの方法が使われています。呼び出し、それをすぐに反映させてから、アプリをアップデートして処理を続けます。この戦略が優れているのは、ユーザーがすぐにアプリを使い始めることができる点です。配置などの重要な値が変更されるのは違和感があるでしょう。エクスペリエンスの低下につながるかもしれません。そのため、多くのデベロッパーは次のようなソリューションを選ぶ傾向にあります。ロード中画面の追加よく使われる戦略として、ユーザーがアプリを開始した際にロード中画面を表示する方法があります。コンテンツに遷移します。ロード中画面が終わってアプリに入ると、すべてがうまくいっているように見えます。ほとんどの場合、クラウドから最新の値がダウンロードされ、アプリがそれを使う準備も完了していることが保証されます。この方式の明らかに大きな欠点は、ロード中画面が追加されたことです。開発にかかる時間や手間もさることながら、ユーザーがアプリに入る際の壁になります。アプリにロード中画面があり、開始時に他の作業やネットワークの呼び出しを行っているのであれば、これは優れた戦略となるでしょう。アプリにまだロード中画面がない場合は、別の戦略を試してみることをお勧めします。値を読み込み、次回に反映これはあまり直感的ではないかもしれませんが、ぜひお読みください。すると、クラウドから取得した前回の値が適用されます。ユーザーはすぐにアプリを使い始めることができます。呼び出してクラウドから新しい値を取得します。完了ハンドラでは、何もしません。そもそも、完了ハンドラを追加する必要すらありません。呼び出すまで、端末のローカルに保存されたままになります。これは、ユーザーがすぐにアプリを使い始めることができる優れた戦略で、アプリのインターフェースが突然変わったりするような奇妙な動作も起こりません。セッションが必要になることです。この動作がアプリにふさわしいかどうかは、ご自身で判断してください。使うような場合は、おそらく問題ないでしょう。日ごとにメッセージを送信したり、日付に固有のコンテンツを提供したりする場合(アプリのスキンを休日用に変更するなど)にはふさわしくないかもしれません。呼び出しが成功したのはいつなのかがわかることです。データの最終取得日時を最初に確認するという中間戦略をとることができます。時間以内など)であれば、そのまま先に進み、「前回取得した値を適用して、次回のために値を取得する」戦略をとることができます。つの戦略のうちどちらかを実行します。キャッシュについてここまで読み込み戦略の話をしてきたので、関連するキャッシュの話題に進みましょう。時間キャッシュされます。この点を勘違いしているデベロッパーもいるようです。サービスによる制限がアプリに適用されることもあります。そもそもなぜこのようなキャッシュや制限の仕組みが存在しているのでしょうか。何百万というユーザーが使うアプリがあっても、確実にこの無償サービスを維持できるようにするためです。適切に動作するキャッシュの仕組みが追加されているので、アプリがどんなに有名になったとしても、このサービスを無償で利用できることが保証されています。この仕組みは質の悪いコードからサービスを守る方法としても有効です。何度も呼び出すようなデベロッパーもいます(もちろん、皆さんのことではありません)。行ったとしても、サービス全体が影響を受けないようにする必要があります。クライアント側のライブラリでキャッシュされた値を提供したり、頻繁に行われるネットワークの呼び出しを制限したりすれば、安全にサービスを維持できます。これは、ユーザーにとってもメリットになります。優れたキャッシュ戦略があれば、アプリから不要なネットワークの呼び出しを何度も行ってユーザーの電池やデータプランを使い果たすようなことはなくなります。そのため、優れたキャッシュ戦略は常に実装すべきものです。実装の開発やテストの際に、この動作を不便に感じることがあるでしょう。モードをオンにしてローカルでの制限動作を無視できるようになっています。実際には、たとえユーザーが毎日アプリを使ったとしても、通常、こういったキャッシュ動作はメリットだけをもたらします。頻繁に値をプッシュしたい場合はどうすればよいでしょうか。「時間ごとのメッセージ」のような機能を提供したいような場合です。サービスが適切なソリューションではないことの表れかもしれません。利用を検討するとよいでしょう。アップデートを大至急適用したい場合もあるかもしれません。前回の変更で意図せずにアプリ内の秩序を乱してしまった場合や、ただちに新しい値を全員に適用したい場合などが考えられます。キャッシュを回避してクライアントに値の取得を強制させるには、どうすればよいでしょうか。使うと、すべての端末にデータのみの通知を送り、保留されている緊急アップデートについて知らせることができます。この通知を受信したアプリは、なんらかのフラグをローカルに保存します。完了時には、忘れずにフラグをクリアして通常のキャッシュ動作に戻すようにしてください。サービスから新しい値を取得させたくなるかもしれませんが、インストールされたすべてのアプリが一斉にこれを行うと、サーバー側の制限の対象になる可能性が高くなります。そのため、このような動作をさせるのではなく、前述の戦略を使用します。することで、すべてのユーザーがアプリを開くまでの期間、ネットワークの呼び出しを分散させることができます。値を読み込む際のちょっとしたテクニックについて紹介しました。動画のコメントでぜひ共有してください。実装しているかをお知らせください。@googledevjp"プロダクトに関するご意見はプロダクトフォーラムにお願いします"GooglePrivacyTerms。