대중교통 환승조회서비스를 이용하여 앱을 개발 중에 있습니다.
개발 상 여러 화면에서 조회가 가능해야하기 때문에 모듈화 작업중에 자꾸 null을 반환하는 일이 생겨서 도움을 얻고자 합니다.
참고로, 저는 이번에 처음으로 외부 api를 사용해보았고, xml파서 또한 처음 사용해보았기 때문에 기초지식이 부족할 수 있습니다.
(학교에서 배운 내용이 아니다보니까 체계적으로 학습을 못했습니다ㅠ)
먼저, 메인 액티비티의 onCreate() 함수에서 호출하는 내용은
Navigation navi = new Navigation(start_lat, start_lng, end_lat, end_lng);
navi.callSub();
보기와 같이, 시작점과 도착점의 좌표정보로 Navigation이라는 제가 만든 클래스의 객체를 생성해주고, 초기화해주었습니다.
테스트해보니 navi라는 객체에 좌표정보는 제대로 들어가있어요.
navi.callSub(); 라고 하면 지하철 환승 경로를 찾아줍니다. (api서버로부터 xml형식의 내용을 가져와서 return 해주려고요)
(바로 return을 해올 수 있다면 좋을텐데, xml파서의 구동원리가 빠삭하지 않아서, )
Navigation 클래스에 callSub()라는 메소드를 만들어서 내부에서 가공된 String값(ResultText, 전역 변수)을 가져오도록 했습니다.
public String callSub(){
new LongRunningGetIO_SUB().execute(); //subway
return ResultText;
}
이 부분이 메인액티비티에서 호출하는 Navigation 클래스의 함수입니다.
예제를 보면서 코딩을 한건데, 창피하지만, 저렇게 바로 객체를 생성하면서 호출을 하는건 처음보았습니다.
심지어 execute(); 라는 메소드는 제가 정의한게 아니고, 코드상에도 없어요. 아마도
LongRunningGetIO_SUB extends AsyncTask <Void, Void, String> <= 여기서 AsyncTask라는 클래스를 상속받았겠거니 싶습니다
로그캣으로 함수에 어떻게 들어가있는지 테스트해봤는데,
저 new Long~~~.execute();가 호출되면
doInBackground -> LongRunningGetIO_SUB -> PullParserFromXML_SUB ( 왜인지 2회 반복;) 하고 로그캣에는 정상적으로 제가 원하는
데이터 값도 출력이 되었습니다. (System.out.println해서 찍어줬어요)
public class LongRunningGetIO_SUB extends AsyncTask <Void, Void, String> {
protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException {
System.out.println("Into LongRunningGetIO_SUB");
/* 버퍼 내용 받아오는 부분**/
}
@Override
protected String doInBackground(Void... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
System.out.println("Into doInBackground");
/*HTTP 방식으로 api 서버와 통신하는 부분. api 호출에 필요한 파라미터 입력*/
}
protected void onPostExecute(String results) {
System.out.println("Into onPostExecute");
/**결과 값이 있으면 PullParserFromXML_SUB 호출하는 부분. 인자는 results*/
}
}
private String PullParserFromXML_SUB(String data){
/**xml 형식을 가공할 때 쓰일 boolean 값들*/
try {
System.out.println("Into PullParserFromXML_SUB");
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_DOCUMENT: // 문서의 시작
/***/
case XmlPullParser.END_DOCUMENT: // 문서의 끝
break;
case XmlPullParser.START_TAG: // 시작 태그를 만나면 이름을 살펴봐서 작업(아무 일도 안하거나 값을 읽어 저장
/***/
case XmlPullParser.END_TAG: // End 태그를 만나면
/***/
case XmlPullParser.TEXT:
/***/
}
eventType = parser.next();
}
/**원하는 값 출력. 정상 출력 됨..*/
} catch(Exception ex) {
ex.printStackTrace();
}
return ReturnText;
}
전역변수로 String ReturnText;를 선언해놓고, Navigation 클래스의 함수 아무데서나 바로 찍히게 해도 (값이 들어있다면) 제가 원하는 값이 나와요.
그런데 이제 클래스 외부에서(메인액티비티에서) navi.getReturnText(); 이런식으로 부르면 null 값이 나오네요.. ㅠ_ㅠ
어떻게 해야할까요? 점검해야 할 부분이 있다면 꼭 좀 조언 부탁드리겠습니다. 제가 어느 부분을 놓치고있는지 모르겠어요 ㅠ