Google 地图无法使用计时器删除标记
Google Maps Cannot Remove Marker Using Timer
我在 Google Maps
上更新当前标记时遇到问题。这些标记是在 activity 开始时创建的。我将所有 merkers 保存到 arraylist
。然后我设置了一个计时器,每 10 秒重新绘制这些标记。
但是系统给我这个错误:
02-26 15:33:53.295: E/AndroidRuntime(21337): java.lang.IllegalStateException: Not on the main thread
好像remove函数触发不了,因为timer不是主线程。
我该怎么办?
代码如下:
public class Discover extends Activity{
GoogleMap googleMap;
PendingIntent pendingIntent;
SharedPreferences sharedPreferences;
ArrayList<Marker> marker1 = new ArrayList<Marker>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create timer
MyTimerTask myTask = new MyTimerTask(this);
Timer myTimer = new Timer();
myTimer.schedule(myTask, 10000, 10000);
setContentView(R.layout.activity_discover);
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
private void drawFriendPosition(Context ctx){
int i = 0;
Cursor c = ctx.getContentResolver().query(DataProvider.CONTENT_URI_PROFILE, null, null, null, null);
while(c.moveToNext()){
Marker melbourne = googleMap.addMarker(new MarkerOptions().position( new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))));
marker1.add(melbourne);
}
}
private void removeFriendPosition(){
Log.i("Marker's length:", ""+marker1.size());
Iterator<Marker> iterator = marker1.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
iterator = marker2.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
}
private void initialMap(Context ctx){
}
class MyTimerTask extends TimerTask {
Discover discover = null;
public MyTimerTask(Discover d) {
this.discover = d;
}
public void run() {
this.discover.removeFriendPosition();
this.discover.drawFriendPosition(this.getBaseContext());
}
}
}
试试这个,在 MyTimerTask
中的 运行() { ... } 中添加这段代码
runOnUiThread(new Runnable(){
@Override
public void run() {
this.discover.removeFriendPosition();
this.discover.drawFriendPosition(this.getBaseContext());
}
});
如果这不起作用,我建议使用 Handler.postDelayed 而不是 TimerTask
我改为处理程序而不是 TimerTask
有用!
此处代码:
public class Discover extends Activity{
GoogleMap googleMap;
PendingIntent pendingIntent;
SharedPreferences sharedPreferences;
ArrayList<Marker> marker1 = new ArrayList<Marker>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
removeFriendPosition();
drawFriendPosition();
}
}, 10000);
setContentView(R.layout.activity_discover);
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
private void drawFriendPosition(){
int i = 0;
Cursor c = this.getBaseContext().getContentResolver().query(DataProvider.CONTENT_URI_PROFILE, null, null, null, null);
while(c.moveToNext()){
Marker melbourne = googleMap.addMarker(new MarkerOptions().position( new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))));
marker1.add(melbourne);
}
}
private void removeFriendPosition(){
Log.i("Marker's length:", ""+marker1.size());
Iterator<Marker> iterator = marker1.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
iterator = marker2.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
}
private void initialMap(Context ctx){
}
}
我在 Google Maps
上更新当前标记时遇到问题。这些标记是在 activity 开始时创建的。我将所有 merkers 保存到 arraylist
。然后我设置了一个计时器,每 10 秒重新绘制这些标记。
但是系统给我这个错误:
02-26 15:33:53.295: E/AndroidRuntime(21337): java.lang.IllegalStateException: Not on the main thread
好像remove函数触发不了,因为timer不是主线程。
我该怎么办?
代码如下:
public class Discover extends Activity{
GoogleMap googleMap;
PendingIntent pendingIntent;
SharedPreferences sharedPreferences;
ArrayList<Marker> marker1 = new ArrayList<Marker>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create timer
MyTimerTask myTask = new MyTimerTask(this);
Timer myTimer = new Timer();
myTimer.schedule(myTask, 10000, 10000);
setContentView(R.layout.activity_discover);
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
private void drawFriendPosition(Context ctx){
int i = 0;
Cursor c = ctx.getContentResolver().query(DataProvider.CONTENT_URI_PROFILE, null, null, null, null);
while(c.moveToNext()){
Marker melbourne = googleMap.addMarker(new MarkerOptions().position( new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))));
marker1.add(melbourne);
}
}
private void removeFriendPosition(){
Log.i("Marker's length:", ""+marker1.size());
Iterator<Marker> iterator = marker1.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
iterator = marker2.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
}
private void initialMap(Context ctx){
}
class MyTimerTask extends TimerTask {
Discover discover = null;
public MyTimerTask(Discover d) {
this.discover = d;
}
public void run() {
this.discover.removeFriendPosition();
this.discover.drawFriendPosition(this.getBaseContext());
}
}
}
试试这个,在 MyTimerTask
中的 运行() { ... } 中添加这段代码 runOnUiThread(new Runnable(){
@Override
public void run() {
this.discover.removeFriendPosition();
this.discover.drawFriendPosition(this.getBaseContext());
}
});
如果这不起作用,我建议使用 Handler.postDelayed 而不是 TimerTask
我改为处理程序而不是 TimerTask 有用!
此处代码:
public class Discover extends Activity{
GoogleMap googleMap;
PendingIntent pendingIntent;
SharedPreferences sharedPreferences;
ArrayList<Marker> marker1 = new ArrayList<Marker>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
removeFriendPosition();
drawFriendPosition();
}
}, 10000);
setContentView(R.layout.activity_discover);
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
private void drawFriendPosition(){
int i = 0;
Cursor c = this.getBaseContext().getContentResolver().query(DataProvider.CONTENT_URI_PROFILE, null, null, null, null);
while(c.moveToNext()){
Marker melbourne = googleMap.addMarker(new MarkerOptions().position( new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude))));
marker1.add(melbourne);
}
}
private void removeFriendPosition(){
Log.i("Marker's length:", ""+marker1.size());
Iterator<Marker> iterator = marker1.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
iterator = marker2.iterator();
while (iterator.hasNext()) {
iterator.next().remove();
}
}
private void initialMap(Context ctx){
}
}