Меня интересует проблема - как можно обновлять содержимое (маркеры) на карте, когда они добавляются в другой поток. Проблема заключается в том, что я добавляю маркеры к карте в другом потоке, частично, чтобы избежать замедления пользовательского интерфейса, потому что это необходимо для создания маркера для анализа базы данных. Кажется, что программа работает правильно - но после создания маркеров они не проверяют карту. Чтобы отобразить их для взаимодействия с картой (коснитесь или измените масштаб). Вот почему я хочу спросить - возможно ли обновить содержимое карты, добавив маркер? Инициируйте изменение масштаба в моем нехорошем решении. Я надеюсь на вашу помощь.Как динамически обновлять контент (маркеры) на MapView в другой поток?
* UPDATE, НО НЕ РАБОТАЕТ *
public void onPostExecute(){
SQLiteDatabase placeDataBase = SQLiteDatabase.openDatabase("/data/data/expir.java.file/databases/PlaceDataBase",
null ,
0);
Cursor location_latitude = placeDataBase.query("AllInfo",new String[]{"LOCATION_LATITUDE"}, null, null, null, null, null);
location_latitude.moveToFirst();
Log.d("CREATE CURSOR 1", "lat");
Cursor location_longitude = placeDataBase.query("AllInfo", new String[]{"LOCATION_LONGITUDE"}, null, null, null, null, null);
location_longitude.moveToFirst();
Cursor location_name = placeDataBase.query("AllInfo", new String[]{"LOCATION_NAME"}, null, null, null, null, null);
location_name.moveToFirst();
Cursor vicinity = placeDataBase.query("AllInfo", new String[]{"VICINITY"}, null, null, null, null, null);
vicinity.moveToFirst();
Cursor id = placeDataBase.query("AllInfo", new String[]{"&&&&&&&&"}, null, null, null, null, null);
id.moveToFirst();
Log.d("CREATE CURSOR 2", "lon");
quantityPlace = location_latitude.getCount();
int a = 0;
for(int i=1;i<=quantityPlace;i++){
if((int)(location_latitude.getDouble(0)*1000000)>=myLocationLatitude-(3*8998)&&
(int)(location_latitude.getDouble(0)*1000000)<=myLocationLatitude+(3*8998)&&
(int)(location_longitude.getDouble(0)*1000000)>=myLocationLongitude-(6*8998)&&
(int)(location_longitude.getDouble(0)*1000000)<=myLocationLongitude+(6*8998)){
a++;
Drawable drawable1 = MyMapActivity.this.getResources().getDrawable(R.drawable.scoutgroup);
itemizedoverlay = new HelloItemizedOverlay(drawable1, MyMapActivity.this); ;
GeoPoint point1 = new GeoPoint((int)(location_latitude.getDouble(0)*1000000), (int)(location_longitude.getDouble(0)*1000000));
overlayitem = new OverlayItem(point1, location_name.getString(0), vicinity.getString(0));
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
Log.d("INFO", location_latitude.getPosition()+"/"+quantityPlace);
location_latitude.moveToPosition(i);
location_longitude.moveToPosition(i);
location_name.moveToPosition(i);
vicinity.moveToPosition(i);
id.moveToPosition(i);
}
Log.d("On map view", a+" location(s)");
mapView.invalidate();
placeDataBase.close();
}
странно - но в предыдущей реализации (в листинге) линии mapView.invalidate() вызывает ошибку. E/AndroidRuntime (5120): android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. Спасибо за ответ, я постараюсь сделать то, что вы рекомендуете. –
опубликуйте свой новый код –
Я попытался реализовать предлагаемый подход - но он не сработал - при использовании аварийных сбоев приложения mapView.invalidate() указывается причина этого: E/AndroidRuntime (3594): java.lang.RuntimeException: ошибка произошла во время выполнения doInBackground() Я попытался сделать добавление маркеров в onPostExecute(), но это часто означает, что ничего не добавляется вообще, хотя все люди на форумах пишут, что необходимо манипулировать им в этом методе потому что doInBackground() не имеет доступа к пользовательскому интерфейсу. –