我正在尝试向我的地图添加标记,坐标和名称包含在一个停止对象中,我通过查询到达堆栈模式数据库,程序运行正常显示地图,但由于某种原因它看起来它没有执行addmarker指令,甚至不会在addMarkers方法中遍历for。此外,我没有在控制台或LogCat中收到任何错误或消息,我已经没有想法来解决这个问题了。
public class MainActivity extends Activity {
GoogleMap map;
List<Stop> stops=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
StackMobAndroid.init(getApplicationContext(), 0, "f4e013f5-3e0f-41e2-af2f-3fc2bfa2446b");
getMarkers();
}
public void getMarkers( )
{
Stop.query(Stop.class, new StackMobQuery().field(new StackMobQueryField("stop")), new StackMobQueryCallback<Stop>() {
@Override
public void success(List<Stop> result) {
addMarkers(result);
}
@Override
public void failure(StackMobException e) {
System.out.println("Fail");
}
});
}
public void addMarkers(List<Stop> stops)
{
for(int i=0;i<=stops.size();i++)
{
LatLng markerPos = new LatLng(stops.get(i).getLatitude(), stops.get(i).getLongitude());
System.out.println(markerPos);
System.out.println(stops.get(i).getName());
System.out.println(i);
map.addMarker(new MarkerOptions().title(stops.get(i).getName()).snippet("test").position(markerPos));
}
}
由于
编辑:如果我手动添加一个标记,让我们说onCreate方法,它将在地图上正确显示。
Edit2:当我在map.addmarker周围放置一个try catch语句时,错误消息显示“Not on the main thread”对此不确定。
答案 0 :(得分:1)
好吧所以我找到了解决方案,显然stackmob查询在一个单独的线程上运行,所以如果你想修改一个ui元素,就像这个例子中的map一样,你必须从success方法调用runonUithread。
public void getMarkers( )
{
Stop.query(Stop.class, new StackMobQuery().field(new StackMobQueryField("stop")), new StackMobQueryCallback<Stop>() {
@Override
public void success(List<Stop> result) {
runThread(result);
}
@Override
public void failure(StackMobException e) {
System.out.println("Fail");
}
});
}
private void runThread(final List<Stop> stops) {
new Thread() {
public void run() {
int i=0;
while (i++ < 1) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
for(int j=0;j<stops.size();j++)
{
LatLng markerPos = new LatLng(stops.get(j).getLatitude(), stops.get(j).getLongitude());
System.out.println(markerPos);
System.out.println(stops.get(j).getName());
System.out.println(j);
try {
map.addMarker(new MarkerOptions().title(stops.get(j).getName()).snippet("test").position(markerPos));
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
});
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}