最適化されていないダウンロードを避ける

アプリのユーザーの中には、インターネット アクセスが断続的であったり、デバイスにダウンロードできる情報の量に制限があったりする場合があります。アプリでダウンロードする必要があるデータの量を減らすことで、ユーザーがアプリをより頻繁に操作するように促すことができます。

ダウンロードを削減する最も基本的な方法は、必要なアイテムのみをダウンロードすることです。 できます。データに関しては、REST API を実装することで、 次のようなパラメータを使用して、返されるデータを制限するクエリ条件を指定します。 時刻を指定します。

同様に、画像をダウンロードする場合は、フルサイズの画像をダウンロードしてクライアント側で削減してもらうのではなく、サーバー側で画像のサイズを削減することをおすすめします。

HTTP レスポンスをキャッシュに保存する

もう 1 つの重要な手法は、重複データのダウンロードを回避することです。Google Chat では 同じデータが繰り返しダウンロードされる可能性を減らすために、 おすすめします。アプリのデータとリソースをキャッシュに保存することで、 アプリが参照する必要がある情報。アプリが 同じ情報を短期間に複数回送信する場合は、 キャッシュへのダウンロードは 1 回だけ許可します

ダウンロードするデータの合計量を減らすには、できるだけ積極的にキャッシュすることが重要です。静的リソースを常にキャッシュに保存する 一定の期間のみ、フルサイズ画像などのオンデマンド ダウンロードを 考えていますオンデマンド リソースは別途保存し、以下を可能にする サイズを管理するために、オンデマンド キャッシュを定期的にフラッシュします。

キャッシュによってアプリに古いデータが表示されないようにするには、 適切な HTTP ステータス コードと、 ヘッダー などの ETag および Last-Modified 使用します。これにより、関連するコンテンツをいつ表示するかを決定できます。 更新されます。例:

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

一部のネットワーキング ライブラリは、これらのステータス コードとヘッダーを自動的に考慮するように構成できます。たとえば OkHttp を使用する場合、クライアントのキャッシュ ディレクトリとキャッシュサイズを構成すると、ライブラリで HTTP キャッシュを使用できるようになります。次のコードサンプルをご覧ください。

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

キャッシュを構成すると、完全にキャッシュされた HTTP リクエストをローカル ストレージから直接処理できるため、ネットワーク接続を開く必要がなくなります。条件付きキャッシュに保存されたレスポンスでは、サーバーからデータの更新を確認できるため、ダウンロードに伴う帯域幅コストを削減できます。まだキャッシュされていなかったレスポンスは、今後のリクエストに備えてレスポンス キャッシュに保存されます。

機密情報でないデータは、Context.getExternalCacheDir() を使用して、管理対象外の外部キャッシュ ディレクトリにキャッシュできます。別の方法として、次の方法を使用して、管理された安全なアプリケーション キャッシュにデータをキャッシュに保存することもできます。 Context.getCacheDir()。 システムの使用可能なストレージが不足している場合、この内部キャッシュはフラッシュされる可能性がある点に注意してください。

リポジトリを使用する

キャッシュ保存のより高度なアプローチについては、リポジトリ設計パターンを検討してください。これには、リポジトリと呼ばれるカスタムクラスを作成します。このクラスは、特定のデータやリソースに対する API 抽象化を提供します。リポジトリは、最初はリモート ウェブサービスなどのさまざまなソースからデータを取得しますが、以降の呼び出しでは、呼び出し元にキャッシュに保存されたバージョンのデータを返します。この レイヤを使用して、堅牢なキャッシュ戦略を提供できます。 カスタマイズすることもできますリポジトリ パターンの使用方法に関する アプリガイド アーキテクチャをご覧ください。