2017-11-11 3 views
0

私はカスタムクラスの約2000個の要素のリストを持っています。これはLatLngという属性の1つです。だから基本的に私は2000のマーカーをすべて地図上にドロップしたいが、それらのすべてを落とすことは地図を遅らせる。だから私は地図のための遅延読み込みを実装することに決めました。私は可視領域にドロップされるマーカーを保持するHashMapを持っています。私はそれをどのように実装したのですか?新しいスレッドにマーカーをドロップする

私のリストを繰り返して、そのアイテムのLatLng座標が表示されているかどうかを確認します。私はLatLngBounds.contains()メソッドを使用してそれを行います。アイテムの座標が可視領域にある場合は、マーカーをドロップしてHashMapに追加します。アイテムの座標が可視領域にない場合は、地図上にあるべきではありません。コードの下

onCameraIdleListener()にあり、作品以上/アウト

for (Event event: listOfEvents) { 
    LatLng latLng = event.getCoordinates(); 
    LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
    boolean isMarkerOnMap = markerksOnMap.contains(latLng); 
    if bounds.contains(latLng) { 
     if (!isMarkerOnMap) { 
      // add marker 
      markersOnMap.add(latLng); 
     } 
    } 
    else if (isMarkerOnMap) { 
     // remove marker 
     markersOnMap.remove(latLng); 
    } 
} 

このコードでは毎回マップを移動またはzoommedされ実行されますが、私のマップは、まだラグです。何が起こるかは、マップが移動され、forループが2000要素を反復処理し、ループが処理されるまでに数秒かかることです。それが起こっている間、地図はフリーズし、地図を移動したり、ズームイン/ズームアウトすることはできません。

forループを非同期スレッドに入れる必要がありますか?どのようなコード例も理解できます。

答えて

0

私はあなたが生成されたマーカーを追加するときに、マーカー

のすべてがそうmarkersOnMapは(それがメインスレッドが起こる)ちょうどすべて削除だけ移入のための非同期メカニズム(asynctask /スレッド/ rxjava)を使用することができると思いますマーカーおよび非同期プロセスasynctask上

例()の結果から、それを置き換える:ちょうど

を実行onCameraIdleListener(上、その後

class GenerateMarkerTask extends AsyncTask(List<Event>, Integer, List<Marker>) { 

protected List<Marker> doInBackground(List<Event>... events) { 
    List<Marker> markers = new ArrayList(); 
    for (Event event: listOfEvents) { 
     LatLng latLng = event.getCoordinates(); 
     LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
     boolean isMarkerOnMap = markerksOnMap.contains(latLng); 
      if bounds.contains(latLng) { 
       if (!isMarkerOnMap) { 
        // add marker 
        markers.add(latLng); 
       } 
      } 
    } 

} 

protected void onPostExecute(List<Marker> result) { 
    markerksOnMap.clear(); 
    for (Marker marker: result) { 
     markersOnMap.add(result); 
    } 

} 

} 

new GenerateMarkerTask.execute(listOfEvents); 
関連する問題