Как показать ProgressDialog во время ожидания HttpRespons?
Привет всем и спасибо за чтение.:)
У меня есть этот код Java (Android), который делает HTTP-запрос и ждет ответа. Запрос запускает сервис, который генерирует PDF-файл и возвращает его.
Служба занимает около 20 секунд, и пока пользователь ждет, я хочу показать диалог прогресса (неопределенный). Я попытался показать диалог в его собственном потоке, который дает мне исключения во время выполнения. Я попытался поместить запрос и ответ в их собственную ветку, но тогда не нужно ждать завершения ответа, и я получаю пустой PDF-файл.
Кто-нибудь может предложить что-нибудь? вот код...
textContainer.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent getPdfFile = null;
File pdfFile = new File(Environment.getExternalStorageDirectory() + "/download/" + fileId.trim() + ".pdf");
if(!pdfFile.exists()) {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getMethod = new HttpGet((
"http://myServices.mySite.org/services.ashx/PDFFILE?fileId="
+ fileId + "&account=" + accountId + "&dataset=" +
account.getProperty("DATASET").getValue().toString().trim()).replace(" ", "%20"));
HttpResponse response = client.execute(getMethod);
InputStream inStream = response.getEntity().getContent();
FileOutputStream fileWriter = new FileOutputStream(Environment.getExternalStorageDirectory() + "/download/" + fileId.trim() + ".pdf");
int dataByte = inStream.read();
while(dataByte > -1) {
fileWriter.write(dataByte);
dataByte = inStream.read();
}
fileWriter.close();
}
catch(Exception e) {
// TODO: Handle the exceptions...
}
getPdfIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(pdfFile), "application/pdf");
startActivity(getPdfIntent);
}
});
Большое спасибо заранее!:)
РЕДАКТИРОВАТЬ: Вот пример, где я использовал AsyncTask, чтобы попытаться решить проблему.
textContainer.setOnClickListener(new View.OnClickListener() {
public void onClick(final View view) {
Intent getPdfFile = null;
File pdfFile = new File(Environment.getExternalStorageDirectory() + "/download/" + fileId.trim() + ".pdf");
if(!pdfFile.exists()) {
new AsyncTask<Boolean, Boolean, Boolean>() {
private ProgressDialog dialog;
protected void onPreExecute() {
dialog = ProgressDialog.show(view.getContext(), "Loading", "Please wait...");
}
protected Boolean doInBackground(Boolean... unused) {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getMethod = new HttpGet((
"http://myServices.mySite.org/services.ashx/PDFFILE?fileId="
+ fileId + "&account=" + accountId + "&dataset=" +
account.getProperty("DATASET").getValue().toString().trim()).replace(" ", "%20"));
HttpResponse response = client.execute(getMethod);
InputStream inStream = response.getEntity().getContent();
FileOutputStream fileWriter = new FileOutputStream(Environment.getExternalStorageDirectory() + "/download/" + fileId.trim() + ".pdf");
int dataByte = inStream.read();
while(dataByte > -1) {
fileWriter.write(dataByte);
dataByte = inStream.read();
}
fileWriter.close();
}
catch(Exception e) {
// TODO: Handle the exceptions...
}
return true;
}
protected void onPostExecute(Boolean unused) {
dialog.dismiss();
}
}.execute(0);
getPdfIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(pdfFile), "application/pdf");
startActivity(getPdfIntent);
}
});
Но происходит то, что я не жду ответа от HttpRequest и продолжает, как если бы ответ был возвращен немедленно.:-/
3 ответа
Похоже, вам нужно поместить последние две строки в else {}
блок, а также в onPostExecute
так что он выполняется только, если файл существует или после завершения AsyncTask.
Вы должны использовать AsyncTask для этого. в методе переопределения "doInBackground" вы можете опубликовать свой httppost и showdialog в методе переопределения "onPreExecute", а затем отменить его в "onPostExecute"
Вам нужно будет использовать AsyncTask ... этот урок должен дать вам основы.