按下按钮并继续下一个Intent,ProgressDialog

时间:2013-10-21 13:16:01

标签: android multithreading android-intent progressdialog stopwatch

我想在我的应用上传图片时显示ProgressDialog。 上传图片可能需要一段时间。 现在我有2个Asynctasks,一个用于将图像上传到服务器,另一个用于发送电子邮件。发送电子邮件后,应弹出下一个意图。

这是我下一个按钮的代码:

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 个答案:

答案 0 :(得分: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 :(得分:1)

当您使用new MyAsyncTask().execute(_mail)

执行MyAsyncTask时,您可以执行MyAsyncTask中步骤4的进度对话框

<强> 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 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);
 }
抱歉任何错字。希望这会有所帮助