我有一个我似乎无法解决的非常疯狂的问题。我尝试了许多不同的方法,但它似乎没有像我预期的那样工作。我想要的是当用户单击我的 MainActivity 上的按钮时,它应该产生一个由 AsyncTask 提供的新线程。MainActivity 应该同时显示一个 ProgressDialog。新创建的线程负责使用 HTTP 连接通过 url 获取 xml,对其进行解析并将数据存储在本地数据库中。
我想要的是 AsyncTask 线程抛出超时异常,或者在没有数据连接或 xml 在 url 上不可用的情况下抛出任何异常。它必须在那时关闭 ProgressDialog。
这就是我所做的,有时它可以工作,但有时它只是长时间显示 ProgressDialog
class RetreiveFeedTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
pd = ProgressDialog.show(MainActivity.this, "Working..",
"Fetching Values", false,true);
}
protected String doInBackground(String... params) {
String xml = null;
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,
false);
HttpGet method = new HttpGet(
new URI(
"http://www.blahblahblah.xml"));
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters,
timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams
.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse res = client.execute(method);
InputStream is = res.getEntity().getContent();
parser.setInput(is, null);
int eventType = parser.getEventType();
parser.nextTag();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (parser.getAttributeCount() == 2) {
myDbHelper.update(parser.getAttributeValue(0),
parser.getAttributeValue(1));
}
}
eventType = parser.next();
}
System.out.println("End document");
xml = "Done, Database updated :)";
}
catch (Exception e) {
xml = "Error: Unable to fetch data";
e.printStackTrace();
}
return xml;
}
@Override
protected void onPostExecute(String xml) {
pd.dismiss();
Toast.makeText(MainActivity.this, xml, Toast.LENGTH_SHORT).show();
}
}