简体   繁体   English

Google Maps无法使用计时器删除标记

[英]Google Maps Cannot Remove Marker Using Timer

I have a problem with update current markers on Google Maps . 我在更新Google Maps上的当前标记时遇到问题。 These markers are created when the activity starts. 这些标记是在活动开始时创建的。 I save all merkers into a arraylist . 我将所有合并程序保存到arraylist Then I set a timer to redraw those markers every 10 seconds. 然后,我设置了一个计时器,以每10秒重绘这些标记。

However System gives me this error: 但是系统给我这个错误:

02-26 15:33:53.295: E/AndroidRuntime(21337): java.lang.IllegalStateException: Not on the main thread 02-26 15:33:53.295:E / AndroidRuntime(21337):java.lang.IllegalStateException:不在主线程上

Seems like the remove function cannot be triggered because the timer is not the main thread. 由于定时器不是主线程,因此似乎无法触发remove函数。

How I suppose to do? 我应该怎么办?

Here is the code: 这是代码:

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

Try this, add this code inside run() { ... } in MyTimerTask 试试看,在MyTimerTask中的run(){...}中添加此代码

  runOnUiThread(new Runnable(){
    @Override
    public void run() {
        this.discover.removeFriendPosition();
        this.discover.drawFriendPosition(this.getBaseContext());
    }
});

If that doesn't work I would suggest using Handler.postDelayed instead TimerTask 如果那不起作用,我建议使用Handler.postDelayed代替TimerTask

I changed to handler instead TimerTask It works! 我改为使用处理程序,而不是TimerTask。

Here code: 这里的代码:

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){ 
    } 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM