Здравейте на всички и благодаря за четенето. :)
Имам този 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 и продължавам, сякаш отговорът е върнат незабавно. :-/
getPdfIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(fakturaFil), "application/pdf"); startActivity(getPdfIntent);
реда код във вашияonPostExecute()
. В момента вие създавате задачата, стартирате я и след това ВЕДНАГА преминавате към следващата дейност. Трябва да изчакате, докато задачата бъде изпълнена. - person DavidAndroidDev   schedule 08.03.2012