gpt4 book ai didi

android - 如何使用 AsyncTask 和 Timer 获取 XML?

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:24 25 4
gpt4 key购买 nike

为了重复从服务器获取 XML 数据,我尝试按照 Mark Murphy's suggestion 使用 AsyncTask 和 Timer .

我收到以下错误:

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 与 Eclipse 结合使用。

我查看了文档、StackOverflow 和 Android 开发人员组,但我不清楚导致错误的原因或修复方法。

我可以获得一次数据——即没有异步和定时器——并通过 SAX 毫无问题地解析它。

下面是完整的应用程序代码。

请原谅任何天真的错误:我是 Android 的新手。

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);
}
}
}

}

最佳答案

问题出在TimerTask的使用上。 TimerTask 运行应该发布到处理程序,如下所示:

private Handler mHandler = new Handler(); 

public class MyTimerTask extends TimerTask {
public void run() {
mHandler.post(
new Runnable() {
public void run() {
new MyAsyncTask().execute("");
}
};
)
}
}

当然这有点难看,所以建议去掉匿名类。

关于android - 如何使用 AsyncTask 和 Timer 获取 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com