私はこの本当にクレイジーな問題を抱えており、取り組むことができないようです。私は自分のアプローチに多くのバリエーションを試しましたが、意図したとおりに機能しないようです。私が望むのは、ユーザーが 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();
}
}