마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

야후에서 날씨정보 얻어와보려고 합니다.

0 추천

야후에서 날씨정보를 얻어오려고 현재 위치의 위도경도를 알아내서 지오코딩으로 도시이름을 알아낸 다음에

woeid를 얻는단계입니다.

public class Main extends Activity {

 TextView tx;
 Geocoder coder;
 Document doc = null;
 String strURL;
 String city;  //도시이름
 String woeid;
 double Latitude; //위도
 double Longitude; //경도
 public void onClick(View view){
  GetXMLTask task = new GetXMLTask(this);
  task.execute(strURL);
 }
 
 //위도저장하는 함수
 public void putLatitude(double x){
  Latitude = x;
 }
 //경도저장하는 함수
 public void putLongitude(double y){
  Longitude = y;
 }
 //위도 반환하는 함수
 public double getLatitude(){
  return Latitude;
 }
 //경도 반환하는 함수
 public double getLongitude(){
  return Longitude;
 }
 //도시이름 저장하는 함수
 public void putCityName(String s){
  city = s;
 }
 //도시이름 반환하는 함수
 public String getCityName(){
  return city;
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  coder = new Geocoder(this);
  tx = (TextView)findViewById(R.id.text);
  
  LocationManager locationManager = 
    (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
  
  LocationListener locationListener = new LocationListener(){

   @Override
   public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    List<Address> list = null;
    try{
     list = coder.getFromLocation(getLatitude(), getLongitude(), 5);
     Address address = list.get(0);
     putCityName(address.getLocality());
    }catch(NumberFormatException e){
    }catch(IOException e){
    }
    strURL=GetLocation.URL1+getCityName()+GetLocation.URL2;
   }

   @Override
   public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void onStatusChanged(String provider, int status,
     Bundle extras) {
    // TODO Auto-generated method stub
    
   }
   
  };
  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
 }
 private class GetXMLTask extends AsyncTask<String, Void, Document>{
  private Activity context;
  
  public GetXMLTask(Activity context){
   this.context = context;
  }
  @Override
  protected Document doInBackground(String... params) {
   // TODO Auto-generated method stub
   URL url;
   try{
    url = new URL(params[0]);
    
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder;
    documentBuilder = documentBuilderFactory.newDocumentBuilder();//xml문서 빌더 객체 생성
    doc = documentBuilder.parse(new InputSource(url.openStream()));//xml문서 파싱
    doc.getDocumentElement().normalize();
   }catch(Exception e){
    Toast.makeText(getBaseContext(), "Parsing Error", Toast.LENGTH_SHORT).show();
   }
   return doc;
  }
  @Override
  protected void onPostExecute(Document result) {
   // TODO Auto-generated method stub
   NodeList nodeList = result.getElementsByTagName("locality1");//locality1이라는 엘리멘트를 가져옴
   woeid = nodeList.item(0).getAttributes().getNamedItem("woeid").getNodeValue();//가져온 아이템의 속성명이 woeid인것을 가져옴
   super.onPostExecute(result);
   tx.setText(woeid);
  }
  
  
 }
}

핸드폰으로 실행해봤더니, 07-12 15:07:41.875: W/dalvikvm(16466): threadid=11: thread exiting with uncaught exception (group=0x40c1d1f8)
07-12 15:07:41.900: E/AndroidRuntime(16466): FATAL EXCEPTION: AsyncTask #1
07-12 15:07:41.900: E/AndroidRuntime(16466): java.lang.RuntimeException: An error occured while executing doInBackground()
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.lang.Thread.run(Thread.java:856)
07-12 15:07:41.900: E/AndroidRuntime(16466): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.os.Handler.<init>(Handler.java:121)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.widget.Toast$TN.<init>(Toast.java:324)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.widget.Toast.<init>(Toast.java:92)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.widget.Toast.makeText(Toast.java:234)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at com.example.getweatherinfo.Main$GetXMLTask.doInBackground(Main.java:135)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at com.example.getweatherinfo.Main$GetXMLTask.doInBackground(Main.java:1)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
07-12 15:07:41.900: E/AndroidRuntime(16466):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-12 15:07:41.900: E/AndroidRuntime(16466):  ... 5 more
이런 에러들이 발생하는군요 ㅠㅠ 책보고 독학하느라 어디서문제인지 알수가없네요.. 고수님들 부탁드려요

 

GetLocation클래스안에는 URL만 딸랑들어있습니다.

package com.example.getweatherinfo;

public class GetLocation {
 public static final String URL1 = "http://query.yahooapis.com/v1/public/yql?q=select * from geo.places where text=\"";
 public static final String URL2 = "\"&format=xml";
}

이렇게요

whity1ove (200 포인트) 님이 2013년 7월 12일 질문
\"는 url에 "가들어가야해서 저렇게했는데..
저건 되는건가요 ㅠ

1개의 답변

0 추천
aucd29 (218,390 포인트) 님이 2013년 7월 12일 답변
...