如何动态更新MapView上的内容(标记)到另一个线程?

时间:2012-10-04 08:25:08

标签: java android multithreading android-mapview marker

我对这个问题很感兴趣 - 当地图上的内容(标记)添加到其他线程时,如何更新内容(标记)。问题在于 - 我在另一个线程中向地图添加标记,部分是为了避免减慢用户界面的速度,因为这是创建分析数据库的标记所必需的。程序似乎正常运行 - 但在设置标记后,它们不会检查地图。为了显示它们与卡片进行交互(触摸或改变比例)。这就是我想问的原因 - 是否可以通过添加标记来更新地图的内容?在我不太好的解决方案中启动规模变更。我希望得到你的帮助。

* 更新,但不工作*

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();
                 }              

2 个答案:

答案 0 :(得分:0)

不要使用Java常用的多线程概念,而应考虑使用Android。 AsyncTask专为满足您的需求而设计。

在doInBackground()方法中使用数据库执行所需操作,并使用onPostExecute()方法的新数据通知mapview。

另外,不要忘记调用mapview.invalidate()重新绘制新标记。

答案 1 :(得分:0)

再说一次,你还没听我说的话。任何与数据库相关的工作都应该在doInBackground()方法中完成。任何与UI相关的工作都应该在onPostExecute()方法中完成。

在添加明细表格之前尝试mapOverlays.clear()