Intereting Posts
Ошибка NavUtils.shouldUpRecreateTask на JellyBean Как получить доступ к моему 127.0.0.1:8000 из Android-планшета Разрешения на листинг приложения Android через adb Изменение цвета фона в раскрывающемся списке автозаполнения searchview Открытое приложение для получения уведомлений о пожарной базе (FCM) Файлы списка андроидов, содержащиеся в подпапке активов Как узнать причину SIGSEGV в Android Как убить мою собственную деятельность – трудный путь Как читать файлы .doc, .docx, .xls в android Растровое преобразование растровых изображений с включенной функцией largeHeap NullPointerException в getActivity (). RunOnUiThread (новый Runnable () { Сохранение потоков и состояния соединения в приложении Android с помощью onSaveInstanceState? Как снять отметку с отмеченных элементов в режиме навигации? Должны ли мы использовать анонимные классы для OnClickListeners или внутренних именованных классов? Обновлено до версии SDK 2.3 – теперь эмуляторы не имеют возможности подключения

(MapView и 1700 элементов Overlays) .equals («Slow»)

У меня есть MapView и я накладываю на него 1700 точек, каждый из которых имеет один и тот же доступный, но с разной информацией. В настоящее время я использую Itemized Overlay, чтобы добавить все оверлеи, после чего они будут заполнены. Это работает, но производительность медленная. Изменение уровня масштабирования и фокуса является неустойчивым. Теперь, было бы лучше использовать ArrayItemizedOverlay так как это то же самое можно сделать, или карта будет такой же медленной?

 import java.util.ArrayList; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.net.Uri; import android.app.Activity; import com.google.android.maps.ItemizedOverlay; import com.google.android.maps.MapView; import com.google.android.maps.OverlayItem; public class Points extends ItemizedOverlay <OverlayItem> { Context mContext; private ArrayList mOverlays = new ArrayList(); String newLine = String.format("%n"); public Points(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); // TODO Auto-generated constructor stub } @Override protected OverlayItem createItem(int i) { return (OverlayItem) mOverlays.get(i); } @Override public int size() { return mOverlays.size(); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { if (!shadow) super.draw(canvas, mapView, shadow); } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); } public void populateNow(){ setLastFocusedIndex(-1); populate(); } public Points(Drawable defaultMarker, Context context) { super(boundCenterBottom(defaultMarker)); mContext = context; } @Override protected boolean onTap(int index) { Intent intent = new Intent(); OverlayItem item = (OverlayItem) mOverlays.get(index); AlertDialog.Builder dialog1 = new AlertDialog.Builder(mContext); dialog1.setTitle(item.getTitle()); String info = item.getSnippet(); String delims = "[$]"; String [] tokens = info.split(delims); String info1 = tokens [0]; String info2 = tokens[1]; String delims2 = "[!]"; String [] tokens2 = info1.split(delims2); double lat = Double.parseDouble(tokens2[0]); double lon = Double.parseDouble(tokens2[1]); final String location = tokens2[0]+","+tokens2[1]; dialog1.setMessage(info2); dialog1.setPositiveButton("Navigate", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Nav(location); } }); dialog1.setNegativeButton("Directions", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Direction(location); } }) ; dialog1.show(); return true; } public void Nav(String location) { Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + location)); mContext.startActivity(i); } public void Direction(String location) { Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?daddr=" + location)); mContext.startActivity(i); } } 

Как я добавляю элементы:

 mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.plug); itemizedoverlay = new Points(drawable, this); while (...) { point = new GeoPoint((int) (lat * 1000000), (int) (lon * 1000000)); overlayitem = new OverlayItem(point, Station_Name, comb); itemizedoverlay.addOverlay(overlayitem); } 

Solutions Collecting From Web of "(MapView и 1700 элементов Overlays) .equals («Slow»)"

Это не решение, а скорее обходное решение, ожидая идеального решения.

У меня была такая же проблема и я создал несколько наложений.

6 накладок с 99 точками действительно быстрее, чем 1 наложение с 600 точками.

(Время загрузки 15 с V с 1 секундой)

  for (int i = 0; i < 99; i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay1.addPoint(gp); } for (int i = 100; i < 199; i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay2.addPoint(gp); } for (int i = 200; i < 299; i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay3.addPoint(gp); } for (int i = 300; i < 399; i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay4.addPoint(gp); } for (int i = 400; i < 499; i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay5.addPoint(gp); } for (int i = 500; i < webcamCursor.getCount(); i++) { webcamCursor.moveToPosition(i); float lat = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lat"))); float lon = Float.valueOf(webcamCursor.getString(webcamCursor .getColumnIndex("Lon"))); GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10)); myOverlay6.addPoint(gp); } System.out.println("**TIME**" + (System.currentTimeMillis() - t)); mMap.getOverlays().add(myOverlay1); mMap.getOverlays().add(myOverlay2); mMap.getOverlays().add(myOverlay3); mMap.getOverlays().add(myOverlay4); mMap.getOverlays().add(myOverlay5); mMap.getOverlays().add(myOverlay6); 

В моем случае я переопределю Overlay#draw() или MapView#draw() чтобы проверить, попадают ли точки в видимую область карты. Проверка лучше с отсортированным массивом исходных точек. Но в первой итерации кодирования я предпочитаю использовать вышеприведенное решение (Profete 162).

Также что-то интересное. http://code.google.com/p/mapview-overlay-manager/wiki/LazyLoading

Я даже не пробовал, но предлагаю некоторые новые идеи.

Кстати, я не знаю, должен ли я отредактировать свой предыдущий ответ, а не публиковать новый, так как это совершенно другое.