게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
(멍청주의) java 함수 도와주세요ㅠㅠ;(feat. 안드 xml파서)
게시물ID : programmer_12968짧은주소 복사하기
작성자 : 뿌뿌빠뿌뿌
추천 : 0
조회수 : 463회
댓글수 : 6개
등록시간 : 2015/08/27 20:17:00
옵션
  • 본인삭제금지

대중교통 환승조회서비스를 이용하여 앱을 개발 중에 있습니다.
개발 상 여러 화면에서 조회가 가능해야하기 때문에 모듈화 작업중에 자꾸 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 값이 나오네요.. ㅠ_ㅠ 

어떻게 해야할까요? 점검해야 할 부분이 있다면 꼭 좀 조언 부탁드리겠습니다. 제가 어느 부분을 놓치고있는지 모르겠어요 ㅠ 

꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호