1

私は、起動時にMapViewを膨らませ、ユーザーの位置を取得し、サーバーにリクエストを送信して、その位置の半径内ですべての関心のあるポイント(POI)をJSONとして取得し、マップ上にそれらのポイントを描画するAndroidアプリを持っています。Google マップと同じように、ユーザーがマップをパンして、最初のデータ ロードの外に出ると、より多くの関心のあるポイントがロードされるようにしたいと考えています。

私の最初の考えは、パンイベントを処理し、パンが停止したときにマップの中心を取得し、その場所の半径内の POI を別のサーバーに要求することです。これは、冗長なデータを送り返し、不要なサーバー要求を行うところまですぐに到達するように思えます。

新しいデータを取得するためのリクエストを行うことができるが、同じデータに対して追加のリクエストを行う必要がないキャッシュ戦略を探しています。私の POI もあまり頻繁に変更されないため、キャッシュはアプリのその後の起動を高速化するのに理想的です。そのようなことのためのベストプラクティスはありますか? それとも、前もってより大きなデータ要求を行い、必要に応じて新しいデータを取得することをお勧めしますか?

4

1 に答える 1

1

自発的に頭に浮かぶのは、たとえば、POIを正方形のタイルに分割することです。これらのタイルにはlastUpdateタイムスタンプがあり、クライアントとサーバーの両方が、地理的位置の中心点と半径ではなく、タイルに関して通信します。クライアントは常にキャッシュされたタイルのlastUpdateタイムスタンプをサーバーに送信し、サーバーは、要求されたタイルのタイムスタンプが変更された場合にのみ、更新されたデータで応答します。もう1つの利点は、POIを取得するためのアルゴリズムが、「ポイントインサークル」計算と比較してはるかに高速になることです。

クライアントアプリは、タイムスタンプに基づいてタイルを再リクエストするタイミングを決定できます。これは、サーバーデータが変更される頻度によって異なります。1日に1回だけ変更される場合は、アプリに1日に1回だけキャッシュされたタイルを再リクエストさせます。私の提案は、固定サイズのタイル(たとえば、2平方マイル)に基づいています。そうしないと、lastUpdateタイムスタンプを追跡するのに苦労することになります。ただし、ズームレベルにいくつかの異なる「詳細レベル」のようなものを作成することも、アプリが現在のズームに応じて左上の表示タイルと右下の表示タイルを計算する必要がある場合もあります。

于 2012-07-30T16:45:49.230 に答える