Маркеры не отображаются на карте после запроса на стек

Я пытаюсь добавить маркеры на мою карту, координаты и имена содержатся в стоп-объекте, который я получаю через запрос к базе данных стека моб, программа работает нормально, отображает карту, но по какой-то причине она выглядит так, как будто не выполняя инструкцию addmarker, даже не перебирает цикл в методе addMarkers. Также я не получаю ошибок или сообщений любого рода в консоли или 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: Когда я помещаю оператор try catch вокруг map.addmarker, появляется сообщение об ошибке "Не в главном потоке", я не уверен в этом.

1 ответ

Решение

Итак, я нашел решение, по-видимому, запрос стека Mob выполняется в отдельном потоке, поэтому, если вы хотите изменить элемент пользовательского интерфейса, например, карту в этом случае, вы должны вызвать runonUithread из метода success.

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();
}
Другие вопросы по тегам