Java 谷歌地图无法使用计时器删除标记

Java 谷歌地图无法使用计时器删除标记,java,android,google-maps,Java,Android,Google Maps,我在更新谷歌地图上的当前标记时遇到问题。这些标记是在活动开始时创建的。我将所有merker保存到arraylist中。然后我设置了一个计时器,每10秒重新绘制这些标记 然而,系统给了我这个错误: 02-26 15:33:53.295:E/AndroidRuntime(21337):java.lang.IllegalStateException:不在主线程上 似乎无法触发删除函数,因为计时器不是主线程 我该怎么办 代码如下: public class Discover extends Activi

我在更新
谷歌地图上的当前标记时遇到问题。这些标记是在活动开始时创建的。我将所有merker保存到
arraylist
中。然后我设置了一个计时器,每10秒重新绘制这些标记

然而,系统给了我这个错误:

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

似乎无法触发删除函数,因为计时器不是主线程

我该怎么办

代码如下:

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());
    }
}
}
公共类发现扩展活动{
谷歌地图谷歌地图;
下垂的下垂的;
SharedReferences SharedReferences;
ArrayList marker1=新的ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//创建计时器
MyTimerTask myTask=新的MyTimerTask(此);
计时器myTimer=新计时器();
myTimer.schedule(myTask,10000,10000);
setContentView(R.layout.activity\u discover);
googleMap=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
私有位置(上下文ctx){
int i=0;
游标c=ctx.getContentResolver().query(DataProvider.CONTENT\u URI\u PROFILE,null,null,null);
而(c.moveToNext()){
Marker melbourne=googleMap.addMarker(新的MarkerOptions().position(新的LatLng(Double.parseDouble(纬度)、Double.parseDouble(经度)));
marker1.add(墨尔本);
}  
} 
私有void removeFriendPosition(){
Log.i(“标记的长度:”,“+marker1.size());
迭代器迭代器=marker1.Iterator();
while(iterator.hasNext()){
iterator.next().remove();
}
迭代器=marker2.iterator();
while(iterator.hasNext()){
iterator.next().remove();
} 
}  
私有void初始映射(上下文ctx){
} 
类MyTimerTask扩展了TimerTask{
Discover=null;
公共MyTimerTask(发现d){
这个发现=d;
}
public void run(){
this.discover.removeFriendPosition();
this.discover.drawFriendPosition(this.getBaseContext());
}
}
}

试试这个,在MyTimerTask的run(){…}中添加这个代码

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

如果这不起作用,我建议使用Handler.postdayed代替TimerTask

试试看,在MyTimerTask的run(){…}中添加这段代码

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

如果这不起作用,我建议使用Handler.postdayed代替TimerTask

我改为Handler代替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){ 
    } 
}
公共类发现扩展活动{
谷歌地图谷歌地图;
下垂的下垂的;
SharedReferences SharedReferences;
ArrayList marker1=新的ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
public void run(){
removeFriendPosition();
drawFriendPosition();
}
}, 10000);
setContentView(R.layout.activity\u discover);
googleMap=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
私有void drawFriendPosition(){
int i=0;
游标c=this.getBaseContext().getContentResolver().query(DataProvider.CONTENT\u URI\u PROFILE,null,null,null);
而(c.moveToNext()){
Marker melbourne=googleMap.addMarker(新的MarkerOptions().position(新的LatLng(Double.parseDouble(纬度)、Double.parseDouble(经度)));
marker1.add(墨尔本);
}  
} 
私有void removeFriendPosition(){
Log.i(“标记的长度:”,“+marker1.size());
迭代器迭代器=marker1.Iterator();
while(iterator.hasNext()){
iterator.next().remove();
}
迭代器=marker2.iterator();
while(iterator.hasNext()){
iterator.next().remove();
} 
}  
私有void初始映射(上下文ctx){
} 
}

我改为处理程序而不是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){ 
    } 
}
公共类发现扩展活动{
谷歌地图谷歌地图;
下垂的下垂的;
SharedReferences SharedReferences;
ArrayList marker1=新的ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
public void run(){
removeFriendPosition();
drawFriendPosition();
}
}, 10000);
setContentView(R.layout.activity\u discover);
googleMap=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
initialMap(this.getBaseContext());
drawFriendPosition(this.getBaseContext());
}
私有void drawFriendPosition(){
int i=0;
游标c=this.getBaseContext().getContentResolver().query(DataProvider.CONTENT\u URI\u PROFILE,null,null,null);
而(c.moveToNext()){
Marker melbourne=googleMap.addMarker(新的MarkerOptions().position(新的LatLng(Double.parseDouble(纬度)、Double.parseDouble(经度)));
marker1.add(墨尔本);
}  
} 
私有void removeFriendPosition(){
Log.i(“标记的长度:”,“+marker1.size());
迭代器迭代器=marker1.Iterator();
while(iterator.hasNext()){
iterator.next().remove();
}
迭代器=marker2.iterator();
while(iterator.hasNext()){
iterator.next().remove();
} 
}  
P