XML 데이터를 서버에서 반복적으로 가져 오려면 Mark Murphy's suggestion에 따라 AsyncTask 및 Timer를 사용하려고합니다.AsyncTask와 Timer를 사용하여 XML을 얻는 방법?
01-07 16:11:26.705: ERROR/AndroidRuntime(729):
Caused by: java.lang.RuntimeException:
Can't create handler inside thread that has not
called Looper.prepare()
내가 Windows에서 이클립스 SDK 1.5을 사용하고 있습니다 :
나는 다음과 같은 오류가 발생합니다.
StackOverflow 및 Android Developers 그룹에서 설명서를 살펴 봤지만 오류의 원인이나 해결 방법을 명확하게 밝히지 않았습니다.
비동기 및 타이머가없는 데이터를 한 번 가져올 수 있으며 문제없이 SAX를 통해 데이터를 파싱 할 수 있습니다.
아래의 전체 앱 코드.
순진한 오류는 변명의 여지가 있습니다.
package com.foo.bar.myactivity;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Timer timer;
timer = new Timer();
timer.schedule(new MyTimerTask(), 0, 1000);
}
public class MyAsyncTask extends AsyncTask<String, Integer, MyData> {
protected MyData doInBackground(String... string) {
MyData myData = new MyData();
try {
URL url = new URL("http://www.example.com/my.xml");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
MyHandler myHandler = new MyHandler();
xr.setContentHandler(myHandler);
System.setProperty("http.proxyHost", "www-cache.example.com");
System.setProperty("http.proxyPort", "80");
xr.parse(new InputSource(url.openStream()));
myData = myHandler.getParsedData();
return myData;
} catch (Exception e) {
Log.e(">>>>>>>>>>>> Error getting myData: ", e.getMessage(), e);
return myData;
}
}
protected void onProgressUpdate(Integer... progress) {
// setProgressPercent(progress[0]);
}
protected void onPostExecute(MyData myData) {
Log.d(">>>>>>>>>>>>>My data: ", myData.toString());
}
}
public class MyTimerTask extends TimerTask {
public void run() {
try {
new MyAsyncTask().execute("");
} catch (Exception e) {
Log.e(">>>>>>>>>>>> Error executing MyAsyncTask: ", e.getMessage(), e);
}
}
}
}
제임스 고맙습니다. 나는 이것을 사용하는 대답을 추가했습니다. –