0

我想在我的應用上傳圖像時顯示ProgressDialog。 上傳圖片可能需要很長時間。 現在我有2個Asynctasks,一個用於將圖像上載到服務器,另一個用於發送電子郵件。發送電子郵件後,下一個意圖應該彈出。按下按鈕並繼續下一個意圖,ProgressDialog

這是我的下一個按鈕的代碼:

public void next(View view) { 
    Intent intent = new Intent(Step4.this, Step5.class); 

    intent.putExtra(EXTRA_MESSAGE, (Serializable) _user); 
    intent.putExtra(EXTRA_MESSAGE2, _isRepairable); 
    intent.putExtra(EXTRA_MESSAGE3, _injury); 
    intent.putExtra(EXTRA_MESSAGE4, _category); 
    intent.putExtra(EXTRA_MESSAGE5, _inch); 
    intent.putExtra(EXTRA_MESSAGE6, _size); 
    mailing(_isRepairable); 
    new UploadImageTask().execute(); 
    startActivity(intent); 
} 

這是我UploadImageTask()

private class UploadImageTask extends AsyncTask<Void, Void, Integer> { 
    ProgressDialog dialog; 
    StopWatch sw = new StopWatch(); 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     dialog = new ProgressDialog(Step4.this); 
     dialog.show(); 
    } 

    protected Integer doInBackground(Void... params) { 
     if (isPhotoTaken()) { 
      sw.start(); 
      ImageUploader.uploadFile(getPhotoPath(), 
        "http://obo.nl/android-upload-image.php", Step4.this); 
      sw.stop(); 
      Debug.out(sw.getTime()); 
     } 
     return null; 
    } 

    protected void onPostExecute(Integer result) { 
     dialog.dismiss(); 
     new MyAsyncTask().execute(_mail); 
    } 
} 

這是我MyAsyncTask

private class MyAsyncTask extends AsyncTask<Mail, Integer, Double> { 
    /** 
    * Private boolean to check if a tire is repairable or not.</br> 
    */ 
    boolean _repairable = Step4._isRepairable; 

    /** 
    * Private integer which counts how many times we've tried to send the 
    * Email. 
    */ 
    private int _counter = 0; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    /** 
    * Method used to start {@link #postData(Mail)} on a background thread. 
    * 
    * @return null 
    */ 
    @Override 
    protected Double doInBackground(Mail... params) { 
     postData(params[0]); 
     return null; 
    } 

    /** 
    * Method used to send the mail through a JSON Request in combination 
    * with the website. If there is no Internet connection the program will 
    * try to send the mail every 10 seconds. 
    * 
    * @param valueIWantToSend 
    */ 
    public void postData(Mail valueIWantToSend) { 
     if (AppStatus.haveNetworkConnection(_context)) { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(
        "http://obo.nl/android-mailing.php"); 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("from", 
         valueIWantToSend.getFrom())); 
       nameValuePairs.add(new BasicNameValuePair("to", 
         valueIWantToSend.getTo())); 
       nameValuePairs.add(new BasicNameValuePair("subject", 
         valueIWantToSend.getSubject())); 
       nameValuePairs.add(new BasicNameValuePair("message", 
         valueIWantToSend.getBody())); 
       nameValuePairs.add(new BasicNameValuePair("localized", 
         getResources().getConfiguration().locale 
           .getDisplayName())); 
       if (PathToPDF(_repairable).contains("Goed_Gekeurd_NL")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_BANDENANALYSE_GOED_GEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains("Afgekeurd_NL")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_BANDENANALYSE_AFGEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains(
         "Goed_Gekeurd_FR")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_ANALYSEPNEUS_GOED_GEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains("Afgekeurd_FR")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_ANALYSEPNEUS_AFGEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains(
         "Goed_Gekeurd_DE")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_REIFENANALYSE_GOED_GEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains("Afgekeurd_DE")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_REIFENANALYSE_AFGEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains(
         "Goed_Gekeurd_EN")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_TYREANALYSE_GOED_GEKEURD_PATH)); 
       } else if (PathToPDF(_repairable).contains("Afgekeurd_EN")) { 
        nameValuePairs.add(new BasicNameValuePair(
          "outputResult", 
          SERVER_TYREANALYSE_AFGEKEURD_PATH)); 
       } 
       if (isPhotoTaken()) { 
        nameValuePairs.add(new BasicNameValuePair("photo", 
          getPhotoPath())); 
       } 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
       String response = httpclient.execute(httppost, 
         responseHandler); 

       // This is the response from a php application 
       String reverseString = response; 
       Log.i("info", reverseString); 

      } catch (ClientProtocolException e) { 

      } catch (IOException e) { 

      } 
     } else { 
      if (_counter == 0) { 
       _counter++; 
       _activity.runOnUiThread(new Runnable() { 
        public void run() { 
         Toast.makeText(_context, 
           getString(R.string.noInternetEmailNotSend), 
           Toast.LENGTH_LONG).show(); 
        } 
       }); 

      } 
      try { 
       Thread.sleep(10000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      postData(valueIWantToSend); 
     } 
    } 

} 

所以,我怎樣才能使它就像ProgressDialog在上傳時顯示的那樣(目前它在上傳時顯示幾秒鐘(比如3秒))在這裏15至20秒。 對話框應該持續整整20秒,而不是僅僅3秒。 另外,當對話框關閉時,它已經轉到下一個意圖。雖然它實際上應該在20秒而不是3秒內進入下一個意圖。

+2

首先上傳你的圖像(異步任務1)在後期執行的異步任務1,你可以調用意圖(異步任務2 \)的郵件上傳?? – Subburaj

+0

感謝它的工作! :) – Baklap4

回答

1

不要關閉該對話框中UploadImageTask

protected void onPostExecute(Integer result) { 
     // dialog.dismiss(); 
     new MyAsyncTask().execute(_mail); 
    } 

但駁回相同的MyAsyncTask

protected void onPostExecute(Integer result) { 
    if (dialog.isShowing()) 
    { 
      dialog.dismiss(); 
    } 
} 
1

你可以做的是通過步驟4的進度對話框中MyAsyncTask你的時候使用new MyAsyncTask().execute(_mail)執行MyAsyncTask

MyAsyncTask

private class MyAsyncTask extends AsyncTask<Mail, Integer, Double> { 

    private ProgressDialog progress = null 

// create constructor to get ProgressDialog passed from onPostExecute of your UploadImageTask 

     public MyAsyncTask (ProgressDialog progress) 
     { 
     this.progress = progress; 
     } 

    // now continue `this.progress` here and dismiss `this.progress` on `onPostExecute` method here 
    } 

onPostExecute您UploadImageTask

protected void onPostExecute(Integer result) 
{ 
     // remove dialog.dismiss(); // dont dismiss dialog here. 

     MyAsyncTask async = new MyAsyncTask(dialog) // pass your current dialog 
     async.execute(_mail); 
} 

對不起任何錯字。希望這會有所幫助

相關問題