Pressing Button and continuing to next Intent, Pro

2019-08-24 02:40发布

问题:

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.

回答1:

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


回答2:

what you can do is pass your progress dialog of step4 in MyAsyncTask when you execute MyAsyncTask using new MyAsyncTask().execute(_mail)

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

sorry for any typo . hope this will help