6

多くのオーバーレイ アイテムを処理するロケーション ベースの Android アプリを開発しています。

背景: マップ上に表示したいエンティティがかなりあります。エンティティの座標は、位置が変わるとリアルタイムで変化します。更新された位置に対応して、エンティティはマップ上で更新されます。エンティティは多数に成長する可能性があります。

実装 2 つのオーバーレイがあります。1 つは MyLocationOverlay がユーザーの位置を表示するためのもので、もう 1 つは、マップに表示する必要があるすべてのエンティティを含む ItemizedOverlay サブクラスです。

問題 エンティティの場所が変更されるたびに、対応するオーバーレイ項目を更新する必要があります。問題は、これを達成するための最良の方法がわからないことです。私にはこれらの選択肢があります

  1. 特定のエンティティの位置を受け取ると、マップからすべてのオーバーレイを削除し、オーバーレイを再度追加します。オーバーレイアイテムの 1 つが更新された場所で作成されました。

    List<Overlay> overlays = map.getOverlays();
    overlays.removeAll(overlays);
    overlays.add(new MyOverlay(marker,this));
    
  2. エンティティごとにオーバーレイを作成します。つまり、それぞれが 1 つのオーバーレイ アイテムのみを含む 500 個のオーバーレイを作成します。Overlay クラスのサブクラスを作成し、独自のプロパティを追加してエンティティを明確に識別し、それぞれに 1 つ作成します。特定のエンティティの場所の更新に到達すると、特定のオーバーレイ アイテムを反復して取得し、それを削除して、場所が更新された新しいアイテムを追加します。

パフォーマンスに関しては、どちらを使用するのが最適かわかりません。

エンティティの数が 500 または 1000 を超えると、すべてのエンティティのすべての位置情報更新 (頻繁に発生する可能性があります) ごとにすべてのオーバーレイを削除して再度追加することは、かなりのオーバーヘッドになると思います。

同時に、同じ数のエンティティを反復することも、同じオーバーヘッドになる可能性があります。

どちらを選択するか、またはこれを実装するためのより良い方法についてのアドバイスをいただければ幸いです。

/アンディ

4

3 に答える 3

1

(パフォーマンスに関して) 最善の解決策は、クラスから継承するカスタム Overlay クラスを作成して、メソッドを必要な方法でOverlayオーバーライドできるようにすることだと思います。onDrawこれを行う方法については、この以前の SO 投稿を参照してください。それを避けたい場合は、ItemizedOverlayをまだ確認していない場合は確認できます。Overlay各エンティティを作成するよりも効率的ですが、最初のアプローチが提案したほど効率的ではありません。

于 2012-07-20T16:49:50.723 に答える
0

私は同じ問題を抱えていました。私がしたことはあなたの最初の選択です。

とにかく、それらをマップに追加する前に別のスレッドにロードし、すべての画像とデータがロードされたら、それらをメイン スレッドのマップに追加します。

于 2012-07-27T11:54:16.197 に答える
0

エンティティをキーとして、overlayItems を HashSet に格納することをお勧めします。エンティティが更新されると、新しい OverlayItem を作成してセットに格納できます。セットなので、古い OverlayItem は削除されます。

OverlayItems を表示するには、ItemizedOverlay を使用します。このItemizedOverlay.createItem(int position)メソッドでは、セットの OverlayItem を取得できます。ItemizedOverlay.getSize()でメソッドをオーバーライドすることを忘れないでくださいreturn set.size()

populate()セットを更新するたびに ItemizedOverlayを呼び出します。

詳細については、このチュートリアルを参照するか、質問がある場合はコメントを入力してください。

于 2012-07-27T15:16:51.620 に答える