Google Map Lag на Android
Я разрабатываю приложение, которое читает файл.csv, выбирает приблизительно 16 точек широты / долготы и наносит их на карту Google.
Тем не менее, кажется, что точки не любят рисовать, пока я не коснусь экрана примерно через минуту (у меня нет установленных слушателей) [это отдельная проблема, на которую, возможно, кто-то также может ответить].
Задача получения точек широты / долготы и их построения помещается в метод AsyncTask doInBackground. Обновление нарисованного состояния карты выполняется в методе AsyncTask onPostExecute.
Я решил, что устраню лаги, так как у меня работает метод AsyncTask. Когда программа запускается, она показывает пустую карту, я жду около 15 секунд, и, если я прикоснусь к карте, точки будут подключены. Однако карта в этой точке невыносимо запаздывает! Приложению требуется по крайней мере 5 секунд, чтобы ответить на мое взаимодействие (например, масштабирование, прокрутка), и даже в этом случае действие действительно замедляется...
Кто-нибудь думает, что они знают причину этого?
Вот большая часть моего кода:
package net.learn2develop.GoogleMaps;
-- imports here
public class MapsActivity extends MapActivity
{
MapView mapView;
MapController mc;
//GeoPoint p;
//GeoPoint p2;
GeoPoint[] p99 = new GeoPoint[16];
public static String[][] bump = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapView);
LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);
@SuppressWarnings("deprecation")
View zoomView = mapView.getZoomControls();
mapView.setStreetView(true);
mapView.setSatellite(false);
zoomLayout.addView(zoomView,
new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
mapView.displayZoomControls(true);
mc = mapView.getController();
// Add points from ReadCsv.java
/** try/catch to-> async was cut from here */
new MapPoint().execute(bump);
mapView.invalidate();
}
public String[][] getArray(BufferedReader bufRdr) {
-- my method that I know works
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
class MapOverlay extends com.google.android.maps.Overlay {
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
// -- array of points---
for(int i = 0; i < bump.length; i++) {
Point screenPts99 = new Point();
mapView.getProjection().toPixels(p99[i], screenPts99);
Bitmap bmp99 = BitmapFactory.decodeResource(
getResources(), R.drawable.redpin);
canvas.drawBitmap(bmp99, screenPts99.x, screenPts99.y-44, null);
}
return true;
}
}
private class MapPoint extends AsyncTask <String[][], String, String> {
@Override
protected String doInBackground(String[][]... voidThisArray) {
String voidThisString = null;
try {
InputStream is = getAssets().open("Training4.csv");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
bump = getArray(reader);
if(bump == null){
setContentView(R.layout.deleteme);
} else {
for(int i = 0; i < bump.length; i++) {
String coordinates99[] = {bump[i][0], bump[i][1]};
double lat99 = Double.parseDouble(coordinates99[0]);
double lng99 = Double.parseDouble(coordinates99[1]);
p99[i] = new GeoPoint(
(int) (lat99 * 1E6),
(int) (lng99 * 1E6));
MapOverlay mapOverlay99 = new MapOverlay();
List<Overlay> listOfOverlays99 = mapView.getOverlays();
listOfOverlays99.add(mapOverlay99);
mapView.refreshDrawableState();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return voidThisString;
}
@Override
protected void onPostExecute(String voidThisString) {
super.onPostExecute(voidThisString);
mapView.refreshDrawableState();
mapView.invalidate();
}
}
}
2 ответа
В onPostExecute используйте mapView.invalidate(); метод, он будет обновлять его и все, что вы сделали в inBackground(), который будет обновляться этим методом
Вы добавляете MapOverlay в цикл for, чтобы каждый оверлей содержал точки bump.length. так что это будет медленно добавлять дублирование точки.
сначала получите все значения lat/lng и сохраните их в массиве p99, а затем добавьте mapoverlay
реализовать код
try {
InputStream is = getAssets().open("Training4.csv");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
bump = getArray(reader);
if(bump == null){
setContentView(R.layout.deleteme);
} else {
for(int i = 0; i < bump.length; i++) {
String coordinates99[] = {bump[i][0], bump[i][1]};
double lat99 = Double.parseDouble(coordinates99[0]);
double lng99 = Double.parseDouble(coordinates99[1]);
p99[i] = new GeoPoint(
(int) (lat99 * 1E6),
(int) (lng99 * 1E6));
}
MapOverlay mapOverlay99 = new MapOverlay();
List<Overlay> listOfOverlays99 = mapView.getOverlays();
listOfOverlays99.add(mapOverlay99);
mapView.refreshDrawableState();
}
} catch (IOException e) {
e.printStackTrace();
}
Ваша ничья ()
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
// -- array of points---
if(bump!=null){
for(int i = 0; i < bump.length; i++) {
Point screenPts99 = new Point();
mapView.getProjection().toPixels(p99[i], screenPts99);
Bitmap bmp99 = BitmapFactory.decodeResource(
getResources(), R.drawable.redpin);
canvas.drawBitmap(bmp99, screenPts99.x, screenPts99.y-44, null);
}
}
return true;
}