0

私はこの問題に興味があります-他のスレッドに追加されたときにマップ上のコンテンツ(マーカー)を更新する方法。問題は、データベースを分析するためのマーカーを作成するために必要なため、ユーザーインターフェイスの速度低下を回避するために、他のスレッドのマップにマーカーを追加するという事実にあります。プログラムは正常に動作しているようですが、マーカーを設定した後は、マップをチェックしません。カードを操作するためにそれらを表示するため(タッチまたはスケールの変更)。これが私が質問したい理由です-マーカーを追加することで地図の内容を更新することは可能ですか?私の良くない解決策で規模の変更を開始します。よろしくお願いします。

*更新しますが、機能しません*

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

2 に答える 2

0

繰り返しますが、あなたは私の言うことを聞いていません。データベースに関連するすべての作業は、doInBackground()メソッドで行う必要があります。UI 関連の作業はすべてonPostExecute()メソッドで行う必要があります。

mapOverlays.clear()アイテム化されたオーバーレイを追加する前に試してください

于 2012-10-04T13:17:59.257 に答える
0

Java の通常のマルチスレッドの概念を使用する代わりに、Android の使用を検討してください。AsyncTask は、あなたのニーズに合わせて設計されています。

doInBackground() メソッドでデータベースに必要なことを行い、onPostExecute() メソッドからの新しいデータで mapview に通知します。

また、 mapview.invalidate() を呼び出して、新しいマーカーを再描画することを忘れないでください。

于 2012-10-04T08:29:25.213 に答える