gpt4 book ai didi

android - 计时器和 map Android

转载 作者:行者123 更新时间:2023-11-29 18:23:16 25 4
gpt4 key购买 nike

我在 map 上显示 ItemizedOverlay(s) 时遇到了一些问题。在这里,我提取了一个我需要做的简化示例。这是我的 map 类:

import java.util.Timer;
import java.util.TimerTask;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

public class Map extends MapActivity {
protected static final String TAG = "Map";
private int test = 0;
private TestItemized items = null;
private Timer timer = new Timer();
private MapView map = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

this.map = (MapView) this.findViewById(R.id.myMapView1);
this.map.setBuiltInZoomControls(true);
this.map.setSatellite(false);
this.map.setStreetView(true);
this.map.setClickable(true);
this.timer.scheduleAtFixedRate(new TimerTask(){

@Override
public void run() {
Log.d(TAG, "refeshing: "+ String.valueOf(test));
Drawable drawable = Map.this.getResources().getDrawable(R.drawable.androidmarker);
test++;
if (Map.this.items instanceof TestItemized && Map.this.map.getOverlays().contains(Map.this.items))
Map.this.map.getOverlays().remove(Map.this.items);
//some code might go here to retrieve new coordinates but this isn't a problem
Map.this.items = new TestItemized(drawable, Map.this);
double lat = 46.491734;
Log.d(TAG,"Latitude : "+ String.valueOf(lat));
double lng = 11.320365;
Log.d(TAG,"Longitude : "+ String.valueOf(lng));

OverlayItem item = new OverlayItem(new GeoPoint((int)(lat * 1E6), (int)(lng * 1E6)), String.valueOf(Map.this.test), "blah!");
Map.this.items.addOverlay(item);
Map.this.map.getOverlays().add(Map.this.items);
Log.d(TAG,"refreshing "+String.valueOf(test)+" is over");
}}, 1000,60000);

}

@Override
protected boolean isRouteDisplayed() {
return false;
}
}

我按照谷歌提供的指南扩展了 ItemizedOverlay 类

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.Toast;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;


@SuppressWarnings("rawtypes")
public class TestItemized extends ItemizedOverlay {
private Context mCtx;
private List<OverlayItem> mItems = new ArrayList<OverlayItem>();

public TestItemized(Drawable arg0) {
super(arg0);
}

/**
* @param defaultMarker
* @param mCtx
*/
public TestItemized(Drawable defaultMarker, Context mCtx) {
super(defaultMarker);
this.mCtx = mCtx;
}

public void addOverlay(OverlayItem overlay) {
this.mItems.add(overlay);
populate();
}


@Override
protected OverlayItem createItem(int i) {
return this.mItems.get(i);
}

@Override
public int size() {
return mItems.size();
}

/* (non-Javadoc)
* @see com.google.android.maps.ItemizedOverlay#onTap(int)
*/
@Override
protected boolean onTap(int index) {
OverlayItem item = this.mItems.get(index);
Toast.makeText(this.mCtx, item.getTitle() +" : " +item.getSnippet(), Toast.LENGTH_LONG).show();
return true;

}


}

从代码中可以清楚地看出,我需要在固定时间更新 map UI,可能会有新的位置,所以我使用的是计时器,但我认为我可能会陷入某种我不会遇到的线程问题知道如何处理,因为在运行测试时我可以在日志中看到发生了什么,但 map 上没有绘制标记。有谁知道如何解决这类问题?

最佳答案

在 run() 方法结束时,完成更新 MapView 后,您应该调用

Map.this.map.postInvalidate();

关于android - 计时器和 map Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com