Как показать ProgressDialog во время ожидания HttpRespons? - PullRequest
0 голосов
/ 07 марта 2012

Привет всем и спасибо за чтение.:)

У меня есть этот код 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 ]

2 голосов
/ 08 марта 2012

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

0 голосов
/ 07 марта 2012

вы должны использовать AsyncTask для этого. в методе переопределения «doInBackground» вы можете опубликовать свой httppost и showdialog в методе переопределения «onPreExecute», а затем отменить его в «onPostExecute»

0 голосов
/ 07 марта 2012

Вам нужно будет использовать AsyncTask ... это руководство должно дать вам основы.

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

...