2016-07-17 13 views
4

私はここにいるので、どんなフィードバックも大歓迎です。私はいくつかのカスタムクラスタを表示するためにDefaultClusterRendererを使用しようとしています。マップが完全にズームされたときにクラスタ化されないようにしようとしていますので、まったく同じ質問に答えました: Disable clustering at max zoom level with Googles android-maps-utils そのコードが、私は得ているメインスレッドではないエラー。どんな助けでも大歓迎です。 私は私のコンストラクタandroid-maps-utilsを使用して最大ズームレベルでのクラスタリングを無効にする

public EspecieRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) { 
    super(context, map, clusterManager); 
    this.mMap = map; 
... 
} 

でこれを持っているし、私はここで

@Override 
protected boolean shouldRenderAsCluster(Cluster<T> cluster) { 
    final float currentZoom = mMap.getCameraPosition().zoom; 
    final float currentMaxZoom = mMap.getMaxZoomLevel(); 
    return currentZoom < currentMaxZoom && cluster.getSize() >= 10; 
} 

をやっているが、私は、クラスタを初期化しています方法です。私は負荷の近くに200種を持っているので、私は1つのまたは複数のマーカーとは、それぞれのマップに追加する、スレッドを使用してい

private void setUpClusterer() { 
    clusterManager = new ClusterManager<>(this, googleMap); 
    clusterManager.setRenderer(new EspecieRenderer<>(this, googleMap, clusterManager)); 
    googleMap.setOnCameraChangeListener(clusterManager); 
    googleMap.setOnMarkerClickListener(clusterManager); 
    ArrayList<Especie> especies = (ArrayList<Especie>) Especie.list(this); 
    for (Especie especie : especies) { 
     ExecutorService queue = Executors.newSingleThreadExecutor(); 
     queue.execute(new EspecieLoader(this, especie)); 
    } 
} 

どこEspecieLoader

public class EspecieLoader implements Runnable { 
    private MainActivity context; 
    private Especie especie; 

    public EspecieLoader(MainActivity mainActivity, Especie especie) { 
     this.context = mainActivity; 
     this.especie = especie; 
    } 

    @Override 
    public void run() { 
     List<Foto> fotos = Foto.findAllByEspecieWithdCoords(context, especie); 
     String nombre = especie.getNombreCientifico(); 
     for (Foto foto : fotos) { 
      LatLng latLng = new LatLng(foto.getLatitud(), foto.getLongitud()); 
      Bitmap bitmap; 
      String path = "new/" + foto.getPath().replaceAll("-", "_").toLowerCase(); 
      try { 
       bitmap = ResourcesHelper.getEncyclopediaAssetByName(context, path); 
       EspecieMarker especieMarker = new EspecieMarker(nombre, bitmap, latLng); 
       context.addSpeciesMarker(especieMarker); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

私がしようとすると、私はこれを取得しています私のアプリを実行する:

07-16 19:18:41.402 31151-32075/com.lzm.Cajas E/AndroidRuntime: FATAL EXCEPTION: Thread-47332 
Process: com.lzm.Cajas, PID: 31151 
java.lang.IllegalStateException: Not on the main thread 
    2at maps.f.g.b(Unknown Source) 
    at maps.z.F.a(Unknown Source) 
    at maps.af.t.a(Unknown Source) 
    at vl.onTransact(:com.google.android.gms.DynamiteModulesB:51) 
    at android.os.Binder.transact(Binder.java:387) 
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.getCameraPosition(Unknown Source) 
    at com.google.android.gms.maps.GoogleMap.getCameraPosition(Unknown Source) 
    at com.lzm.Cajas.map.EspecieRenderer.shouldRenderAsCluster(EspecieRenderer.java:62) 
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$RenderTask.run(DefaultClusterRenderer.java:416) 
    at java.lang.Thread.run(Thread.java:818) 
+0

は、あなたがどのようにクラスタマネージャを初期化し、それにアイテムを追加している示してもらえますか? – antonio

+0

私は質問をクラスタの初期化で更新しました – luzma

+0

問題は、 'Runnable'ではなく、メインスレッドにマーカーを追加する必要があることです。 – antonio

答えて

8

私は今日も同じニーズに遭遇しました。これは私のソリューションです: あなたがsetOnCameraChangeListener二度設定することはできませんので、

googleMap.setOnCameraChangeListener(clusterManager); 

を削除し、

googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
     @Override 
     public void onCameraChange(CameraPosition cameraPosition) { 
      shouldCluster_zoom = cameraPosition.zoom < 9; //disables the cluster at 9 and higher zoom levels 
      clusterManager.onCameraChange(cameraPosition); //Replaces googleMap.setOnCameraChangeListener(clusterManager); 
     } 
    }); 

shouldCluster_zoomは」明らかに、グローバル変数、静的およびブールであるとそれを交換してください。 今「shouldRenderAsCluster」方式のチェックでは、ズームによると、マーカーは、クラスタ化されなければならない場合:

@Override 
    protected boolean shouldRenderAsCluster(Cluster<T> cluster) { 
     return super.shouldRenderAsCluster(cluster) && Your_class_name.shouldCluster_zoom; 
    } 
+0

私はそれを打つとあなたに知らせる – luzma

+0

これは働いているようです – luzma

関連する問題