2012-10-04 4 views
0

Меня интересует проблема - как можно обновлять содержимое (маркеры) на карте, когда они добавляются в другой поток. Проблема заключается в том, что я добавляю маркеры к карте в другом потоке, частично, чтобы избежать замедления пользовательского интерфейса, потому что это необходимо для создания маркера для анализа базы данных. Кажется, что программа работает правильно - но после создания маркеров они не проверяют карту. Чтобы отобразить их для взаимодействия с картой (коснитесь или измените масштаб). Вот почему я хочу спросить - возможно ли обновить содержимое карты, добавив маркер? Инициируйте изменение масштаба в моем нехорошем решении. Я надеюсь на вашу помощь.Как динамически обновлять контент (маркеры) на 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(); 
       }    

ответ

0

Вместо того, чтобы использовать обычные многопоточных концепции программирования Java, рассмотреть возможность использования Android. AsyncTask разработан для ваших нужд.

Выполняйте то, что вам нужно с вашей базой данных в методе doInBackground(), и сообщите о своем представлении карты новыми данными из метода onPostExecute().

Кроме того, не забудьте вызвать mapview.invalidate(), чтобы перерисовать новые маркеры.

+0

странно - но в предыдущей реализации (в листинге) линии mapView.invalidate() вызывает ошибку. E/AndroidRuntime (5120): android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. Спасибо за ответ, я постараюсь сделать то, что вы рекомендуете. –

+0

опубликуйте свой новый код –

+0

Я попытался реализовать предлагаемый подход - но он не сработал - при использовании аварийных сбоев приложения mapView.invalidate() указывается причина этого: E/AndroidRuntime (3594): java.lang.RuntimeException: ошибка произошла во время выполнения doInBackground() Я попытался сделать добавление маркеров в onPostExecute(), но это часто означает, что ничего не добавляется вообще, хотя все люди на форумах пишут, что необходимо манипулировать им в этом методе потому что doInBackground() не имеет доступа к пользовательскому интерфейсу. –

0

еще раз, вы не слушаете, что я сказал. Любая работа, связанная с базой данных, должна выполняться в методе doInBackground(). любая работа, связанная с пользовательским интерфейсом, должна выполняться в методе onPostExecute().

попробовать mapOverlays.clear(), прежде чем добавить детализированный накладку

+0

Нет - я правильно понял - я просто подумал, что это деление на базу данных и добавление маркеров слишком ресурсоемким из-за необходимости промежуточных переменных. Теперь я пытаюсь реализовать именно то, что вы сказали. –

 Смежные вопросы

  • Нет связанных вопросов^_^