Search code examples
androidmultithreadingandroid-intentprogressdialogstopwatch

Pressing Button and continuing to next Intent, ProgressDialog


I want to show a ProgressDialog when my app is uploading an image. As uploading an image can take quite a while. Now I have 2 Asynctasks, one for uploading an Image to the server, and one for sending the email. After sending the email, the next intent should pop up.

This is the code for my next Button:

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);
}

This is my 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);
    }
}

This is my 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);
        }
    }

}

So how can i make it like that the ProgressDialog shows up while uploading (for now it shows up for a few seconds (say 3 seconds) while uploading takes 15 - 20 seconds here. The Dialog should be up for the whole 20 seconds instead of only 3 seconds. Also when the dialog closes, it already goes to the next intent. While it actually should go to the next intent in 20 seconds instead of 3 seconds.


Solution

  • Do not dismiss the dialog in UploadImageTask

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

    But dismiss the same in MyAsyncTask

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