2017-11-11 29 views
0

我有一個包含LatLng作爲其中一個屬性的我的CustomClass約2000個元素的列表。所以基本上我想放棄地圖上的所有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但我的地圖仍然laggy。會發生什麼情況是地圖移動時,for循環遍歷2000個元素,並且循環需要幾秒鐘來處理。發生這種情況時,地圖凍結,我無法移動地圖或放大/縮小。

我應該將for循環放入異步線程嗎?任何示例代碼將不勝感激。

回答

0

我想你可以使用異步機制(的AsyncTask /線程/ rxjava)只是爲了填充所有標記的

所以當添加生成標記的markersOnMap(它發生在主線程)只是刪除所有標記與來自異步過程

例如上的AsyncTask()的結果替換:

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); 
    } 

} 

} 

然後onCameraIdleListener()只需要運行

new GenerateMarkerTask.execute(listOfEvents);