야후에서 날씨정보를 얻어오려고 현재 위치의 위도경도를 알아내서 지오코딩으로 도시이름을 알아낸 다음에
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";
}
이렇게요