Tech. Forum 개발자들을 위한 정보 공유의 장입니다
닫기

Tech.Forum

findPathDataAllType에서 경로 받아온 후 객체에 저장 시점

#1

안녕하세요. 학교 프로젝트에서 Tmap api를 이용하여 보행자 내비게이션을 개발하려고 합니다.
Tmap api document에 있는 예제를 참고해서 경로를 받아오는 것까지 성공해서 이를 ArrayList(전역변수)에 저장하려고 하는데 findPathDataAllType 부분을 나와서 출력해보니 아무런 값도 저장되어있지 않는 것을 확인했습니다.

추측해보기로는 findPathDataAllType 의 callback함수가 비동기적으로 작동해서 전역변수에 저장되는 시점을 확인 할 수 없는것 같은데, 도저히 해결방법을 모르겠습니다. 혹시 추측이 맞다면 동기적으로 처리할 수 있는 방법이 있을까요? 답변 부탁드립니다.

다음은 해당 부분의 코드입니다.

public void Navigation(TMapPoint point2, TextToSpeech tts) {
    TMapData tmapdata = new TMapData();
    TMapPoint point1 = tMapView.getCenterPoint();

    tmapdata.findPathDataAllType(TMapData.TMapPathType.PEDESTRIAN_PATH, point1, point2, new TMapData.FindPathDataAllListenerCallback() {
        @Override
        public void onFindPathDataAll(Document document) {
            Element root = document.getDocumentElement();
            NodeList nodeListPlacemark = root.getElementsByTagName("Placemark");
            for( int i=0; i<nodeListPlacemark.getLength(); i++ ) {
                NodeList nodeListPlacemarkItem = nodeListPlacemark.item(i).getChildNodes();
                for( int j=0; j<nodeListPlacemarkItem.getLength(); j++ ) {
                    if( nodeListPlacemarkItem.item(j).getNodeName().equals("description") ) {
                        // 네비게이션 시작을 위한 TTS 객체 소환
                        Route.add(nodeListPlacemarkItem.item(j).getTextContent().trim());
                        tts.speak(nodeListPlacemarkItem.item(j).getTextContent().trim() , TextToSpeech.QUEUE_FLUSH, null);
                        Log.d("debug", nodeListPlacemarkItem.item(j).getTextContent().trim() );
                    }
                    else if(nodeListPlacemarkItem.item(j).getNodeName().equals("Point")) {
                        String location[] = nodeListPlacemarkItem.item(j).getTextContent().trim().split(",");
                        double longitude = Double.parseDouble(location[0]);
                        double latitude = Double.parseDouble(location[1]);
                    }
                }
            }
        }

    });


}
0 Likes

#3

안녕하세요.
T map API 운영담당자 입니다.

문의주신 내용을 검토해본 결과 findPathDataAllType 함수의 callback이 동작하기전 ArrayList를 출력하여 발생한 문제로 판단됩니다.

처리하시려는 로직을 onFindPathDataAll함수의 반복문이 동작한 이후에 처리하시면 원하시는 값을 얻을 수 있습니다.

감사합니다.

0 Likes

#4

호출부분 아래에 출력문을 넣어도 값이 출력되지 않습니다.

위에 올렸던 부분이 선언부분이고 지금 코드가 호출 부분입니다.

제가 비동기적인 작동에 대해서 문의 드린 이유가 애초에 코드순서와 다르게 작동이 되기 때문입니다. 그래서 해당 부분을 동기적으로 작동시켜서 "경로 가져와서 객체에 저장 -> 다른 메소드에서 객체 이용하여 작동하기"를 구현할 수 있는 방법을 알고싶습니다.

public class tmap extends AppCompatActivity {

  TextToSpeech tts;
  private boolean m_bTrackingMode = true;
  private Context mContext = null;

  private TMapGpsManager tmapgps = null;
  TMapView tMapView;
  TMapData tMapData;
  private static String mApiKey = "API키";
  private static int mMarkerID;

  private ArrayList<TMapPoint> m_tmapPoint = new ArrayList<>();
  private ArrayList<String> mArrayMarkerID = new ArrayList<>();
  private ArrayList<MapPoint> m_mapPoint = new ArrayList<>();
  private ArrayList<String> Route;
  public Location location;

  @Override
  protected void onCreate(Bundle savedInstanceState) {

      ...

      Navigation(point2,tts);
      System.out.println("Route" + Route);
  }

0 Likes

#5

안녕하세요.
T map API 운영담당자 입니다.

위의 글에서 반복문이 동작한 이후 처리하라고 말씀드린 이유는 안드로이드 통신방식은 기본이 비동기식으로 동기화 설정이 불가능합니다.

다만, 아래의 예시와 같이 Navigation 메소드의 callback에서 ArrayList 값을 셋팅한 이후 별도의 메소드를 호출하는 방법으로 접근하시면 윈하시는 값을 얻을 수 있습니다. ----------------- protected void onCreate(Bundle savedInstanceState) {   ...

  Navigation(point2,tts); }

public void Navigation(TMapPoint point2, TextToSpeech tts) {   TMapData tmapdata = new TMapData();   TMapPoint point1 = tMapView.getCenterPoint();

  tmapdata.findPathDataAllType(TMapData.TMapPathType.PEDESTRIAN_PATH, point1, point2, new TMapData.FindPathDataAllListenerCallback() {
      @Override
      public void onFindPathDataAll(Document document) {
          Element root = document.getDocumentElement();
          NodeList nodeListPlacemark = root.getElementsByTagName("Placemark");
          for( int i=0; i<nodeListPlacemark.getLength(); i++ ) {
              NodeList nodeListPlacemarkItem = nodeListPlacemark.item(i).getChildNodes();
              for( int j=0; j<nodeListPlacemarkItem.getLength(); j++ ) {
                  if( nodeListPlacemarkItem.item(j).getNodeName().equals("description") ) {
                      // 네비게이션 시작을 위한 TTS 객체 소환
                      Route.add(nodeListPlacemarkItem.item(j).getTextContent().trim());
                      tts.speak(nodeListPlacemarkItem.item(j).getTextContent().trim() , TextToSpeech.QUEUE_FLUSH, null);
                      Log.d("debug", nodeListPlacemarkItem.item(j).getTextContent().trim() );
                  }
                  else if(nodeListPlacemarkItem.item(j).getNodeName().equals("Point")) {
                      String location[] = nodeListPlacemarkItem.item(j).getTextContent().trim().split(",");
                      double longitude = Double.parseDouble(location[0]);
                      double latitude = Double.parseDouble(location[1]);
                  }
              }
          }
		
          sysoRoute(); // 반복문 동작 이후 동작
      }

  });

}


private void sysoRoute() {
  System.out.println(“Route” + Route);
}

감사합니다.

0 Likes