안드로이드 개발 질문/답변
(글 수 45,052)
GPS쪽을 작업하고 있는데요...
아래의 소스에서 위도 경도 값이 바뀌면 LocationListener 의 onLocationChanged 가 업데이트 되는듯하여
위도 경도값을 변경해서 보여주려고 하는데요....
아래의 ImageView iv_xml_state_icon = (ImageView)findViewById(R.id.xml_state_icon); 부분에서 오류가 납니다....
그래서 궁금한것이 글의 제목에서처럼 onLocationChanged(Location location)에서는 UI를 업데이트 할 수가 없는것인가요????
만일 그렇다면 변경된 위도/경도값을 사용자에게 보여주려면 어케하면 좋을까요????
private final LocationListener locationListener = new LocationListener()
{
//새로운 위치를 기반으로 어플을 업데이트한다.
//새로운 위치를 얻게되면 메인 정보창을 업데이트한다.
public void onLocationChanged(Location location)
{
if(DebugUtils.LOGV) DebugUtils.v("@@@@@@@@@@ ==> 1");
updateWithNewLocation(location);
double lat, lng, ele;
String conState, gpsPlace;
long gpsDate;
lat = location.getLatitude();
lng = location.getLongitude();
ele = location.getAltitude();
conState = location.getProvider();
gpsDate = location.getTime();
ImageView iv_xml_state_icon = (ImageView)findViewById(R.id.xml_state_icon); //GPS상태 (<==여기서부터오류)
TextView tv_xml_state_lat= (TextView)findViewById(R.id.xml_state_lat); //위도
TextView tv_xml_state_lng = (TextView)findViewById(R.id.xml_state_lng); //경도
TextView tv_xml_state_addr = (TextView)findViewById(R.id.xml_state_addr); //주소
TextView tv_xml_state_time = (TextView)findViewById(R.id.xml_state_time); //연결시간
... 생략...
2011.01.31 22:15:57
답변감사합니다...
잘몰라서 그러는데요... "Locationlistener는 메인쓰레드와 다른 쓰레드임으로 Gui를 직접 그리지 마시고 경위도 좌표를 저장만 하시고 메인에서 가져갈수 있도록 getter함수를 만들어서 제공해 주세요"에 대해서 약간의 예제를 좀 알려주시면 안될까요????
아니면 참고할 수 있는곳이라도 좀 알려주시면 감사하겠습니다.. ㅠㅠ..
2011.02.01 09:57:38
설계상 Main - GUI - GPS Module간 구분을 해서 설계하는 것이 좋다는 의미였는데, 이를 위해서는 Main 쪽에서 Thread를 생성해서 GPS Module에 대한 관리를 따로 해줘야 합니다.
간단한 프로젝트의 경우에는 그냥 Activity내에 LocationListener를 등록해서 사용해도 상관은 없습니다.
위의 예에서는 리소스에 대한 선언과 등록을 LocationListener에서 하는 것보다는
아래와 같은 리소스 등록은
ImageView iv_xml_state_icon = (ImageView)findViewById(R.id.xml_state_icon); //GPS상태 (<==여기서부터오류)
Activity의 onCreate()에서 하시고, LocationListener내에서는 setTextView로 갱신만 해주시는게 좋습니다.
예를 들어 tv_xml_state_lat.setTextView(lat.toString())하시면 될것 같습니다.
간단한 프로젝트의 경우에는 그냥 Activity내에 LocationListener를 등록해서 사용해도 상관은 없습니다.
위의 예에서는 리소스에 대한 선언과 등록을 LocationListener에서 하는 것보다는
아래와 같은 리소스 등록은
ImageView iv_xml_state_icon = (ImageView)findViewById(R.id.xml_state_icon); //GPS상태 (<==여기서부터오류)
TextView tv_xml_state_lat= (TextView)findViewById(R.id.xml_state_lat); //위도
Activity의 onCreate()에서 하시고, LocationListener내에서는 setTextView로 갱신만 해주시는게 좋습니다.
예를 들어 tv_xml_state_lat.setTextView(lat.toString())하시면 될것 같습니다.




Locationlistener는 메인쓰레드와 다른 쓰레드임으로 Gui를 직접 그리지 마시고 경위도 좌표를 저장만 하시고 메인에서 가져갈수 있도록 getter함수를 만들어서 제공해 주세요.
메인 쓰레드(activity or service)에서는 200ms~800ms 내로 경위도 좌표를 얻어가서 text view에 그려주시면 됩니다.
많이 호출을 해도 Gps데이타는 사양상 1초에 한번씩 갱신 됩니다.
정리하면 연산 로직과 Gui를 분리햐서 설계하도록 하세요.^__^