2014-01-29 2 views
0

맵에 마커를 추가하려고하는데 좌표 및 이름이 stackmob 데이터베이스에 대한 쿼리를 통해 가져 오는 중지 개체에 포함되어 있고 프로그램이 잘 실행됩니다 지도,하지만 addmarker 명령을 실행하지 않는 것처럼 보이기 때문에 addMarkers 메서드에서 for를 반복하지 않습니다. 또한 콘솔이나 LogCat에서 어떤 종류의 오류나 메시지를받지 못하고 있습니다. 문제를 해결하기 위해 아이디어가 부족합니다.stackmob 쿼리 후 마커가 표시되지 않음

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"가 표시됩니다.

답변

1

좋아, 그럼 분명히 stackmob 쿼리가 별도의 스레드에서 실행되도록하면 요,이 경우에는지도처럼 ui 요소를 수정하려는 경우, 당신은 성공 방법에서 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(); 
} 
관련 문제