Как да покажа 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 и продължавам, сякаш отговорът е върнат незабавно. :-/


person Hessi-Dude    schedule 07.03.2012    source източник
comment
правите мрежово повикване в потребителския интерфейс. не трябва да правите това. вместо това използвайте асинхронна задача.   -  person njzk2    schedule 07.03.2012
comment
njzk2 е правилен и мисля, че всъщност не е разрешен на Android 3.0 SDK и по-нови версии   -  person Tony    schedule 07.03.2012
comment
Току-що редактирах публикацията си, за да включва AsyncTask, който опитах, без никакъв късмет.   -  person Hessi-Dude    schedule 07.03.2012
comment
Може ли някой да ми каже какво правя погрешно? моля... това е едно от последните останали неща за завършване на версия едно. :)   -  person Hessi-Dude    schedule 08.03.2012
comment
Опитахте ли да промените върнатата стойност? По някаква причина си спомням, че трябваше да коригирам върнатата стойност на метод, за да спре да изпълнява нещо друго.   -  person Tony    schedule 08.03.2012
comment
Толкова съжалявам момчета.... тези работят добре! Не знам какво не е наред в главата ми... Трябва да накарам основната си нишка (UI-нишка) да чака нишката AsyncTask. Някой знае ли как се прави това? :)   -  person Hessi-Dude    schedule 08.03.2012
comment
Направих този грозен код, за да стане wat... boolean downloaded = false; докато(!изтеглено) { /*чака...*/ }. Но тогава ProgressDialog е пропуснат. Не се показва. Ако премахна кода си за грозно изчакване и опитам отново, той се опитва да стартира pdf намерението ми дава грешка и когато натисна обратно, ProgressDialog работи добре и спира, когато файлът се изтегли... :-|   -  person Hessi-Dude    schedule 08.03.2012
comment
@RichB е прав за това. Трябва да преместите своите getPdfIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(fakturaFil), "application/pdf"); startActivity(getPdfIntent); реда код във вашия onPostExecute(). В момента вие създавате задачата, стартирате я и след това ВЕДНАГА преминавате към следващата дейност. Трябва да изчакате, докато задачата бъде изпълнена.   -  person DavidAndroidDev    schedule 08.03.2012


Отговори (3)


Изглежда, че трябва да поставите последните си два реда вътре в блок else {}, а също и в onPostExecute, така че да се изпълнява само ако файлът съществува или след завършване на AsyncTask.

person Rich B    schedule 08.03.2012
comment
Обичам ви момчета, благодаря много! Това оправи всичко. Не знам защо не се сетих за това, но все пак голямо благодаря! :) - person Hessi-Dude; 09.03.2012

Ще трябва да използвате AsyncTask ... този урок трябва да ви даде основите.

http://droidapp.co.uk/?p=177

person Tony    schedule 07.03.2012
comment
Ето какво направих... показвам диалоговия прозорец в метода onPreExecute, правя заявка в метода doInBackground и отхвърлям диалоговия прозорец в метода onPostExecute. Това, което се случва, е, че продължава да се опитва да покаже pdf файла, преди отговорът да е готов. С други думи, не чака отговорът да приключи. И когато получа съобщение за грешка, че файлът не може да бъде прочетен и натисна назад, показва диалоговия прозорец, който никога не се отхвърля?? :-| - person Hessi-Dude; 07.03.2012
comment
Можете ли да промените първата си публикация и да поставите новия код, който използвате? - person Tony; 07.03.2012
comment
линк die pls fix - person Felix; 05.06.2017

трябва да използвате AsyncTask, за да направите това. на метода за заместване "doInBackground" можете да публикувате своя httppost и showdialog върху метода за заместване "onPreExecute", след което да го отмените на "onPostExecute"

person sam    schedule 07.03.2012
comment
Точно това опитах, но няма да изчака отговора, а просто продължава. - person Hessi-Dude; 07.03.2012
comment
Не разбирам, че имате предвид, че правите само http заявка, тогава няма да се грижите за отговора. Но вашият въпрос е как да [покажете] прогрес диалоговия прозорец, когато чакате отговор... каквото и да било... Мисля, че може би можете да използвате манипулатор, за да направите това. - person sam; 22.03.2012