3

Below is my code my trying to display my progress in Asyntask via onProgressUpdate method but it aint showing in the alert diaalog. Only the initial message is shown.

 class DownloadFileFromURL extends AsyncTask<String, String, String> {

        private AlertDialog.Builder alert;
        private int progress = 0;
        /**
         * Before starting background thread Show Progress Bar Dialog
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            alert = new AlertDialog.Builder(context);
            alert.setTitle("Downloading..");
            alert.setMessage("1");
            alert.setCancelable(false);
            alert.show();
        }

        /**
         * Downloading file in background thread
         */
        @Override
        protected String doInBackground(String... f_url) {
            int count;
            try {
                URL url = new URL(f_url[0]);
                URLConnection conection = url.openConnection();
                conection.connect();

                // this will be useful so that you can show a tipical 0-100%
                // progress bar
                int lenghtOfFile = conection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream(),
                        8192);

                // Output stream
                OutputStream output = new FileOutputStream(file);

                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    // After this onProgressUpdate will be called
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));

                    // writing data to file
                    output.write(data, 0, count);
                }

                // flushing output
                output.flush();

                // closing streams
                output.close();
                input.close();

            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }

            return null;
        }

        /**
         * Updating progress bar
         */
        @Override
        protected void onProgressUpdate(String... progress) {
            Log.d("Myapp","progress :"+progress[0]);
            alert.setMessage(""+progress[0]);
        }

        /**
         * After completing background task Dismiss the progress dialog
         **/
        @Override
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after the file was downloaded
}
}

As i have also written a log to show progress update in onProgressUpdate, the log is printed but the alert.setMessage in onProgressUpdate seems not set the message to my alert dialog.

  • I think it will better if you use ProgressDialog instead of AlertDialog. – xxx May 04 '16 at 06:13
  • you use setmessage not on alertdialog but builder. and how about replace middle argument type String with Integer? – iroiroys May 04 '16 at 06:21
  • @iroiroys yeah i was doin that wrong as i thought it would work that way, and yeah i changed middle argument type to integer Thanks..!! –  May 04 '16 at 06:29

2 Answers2

5

As per your code, alert is an AlertDialog.Builder and not an AlertDialog itself. This raised a concern to me because the reason it might not be changing is because you already showed the builder, but not give to an AlertDialog. So I tried out a simple code:

public class MainActivity extends AppCompatActivity {

    private AlertDialog.Builder alert;
    private AlertDialog ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        alert = new AlertDialog.Builder(this);
        alert.setTitle("Downloading..");
        alert.setMessage("1");
        alert.setCancelable(false);
        ad = alert.show();


        Log.d("SAMPLE", "SET MESSAGE 2");
        alert.setMessage("2");

        Log.d("SAMPLE", "SET MESSAGE 3");
        ad.setMessage("3");
    }

}

At first, I just used the alert.setMessage (this is the AlertDialog.Builder), and the message did not change at all. But after putting it in an AlertDialog and then setting the message of the AlertDialog instance, the message changed. Care to try this approach out. Pass the AlertDialog.Builder to an AlertDialog first then, setMessage using the AlertDialog instance.

Docs for AlertDialog and AlertDialog.Builder.

Nimantha
  • 6,405
  • 6
  • 28
  • 69
AL.
  • 36,815
  • 10
  • 142
  • 281
  • You can simply use: ad = new AlertDialog.Builder(this).create(); – Asama May 04 '16 at 06:07
  • @Asama Yup. But I did it this way for clarity. – AL. May 04 '16 at 06:07
  • 1
    You can use that like this: AlertDialog ad = new AlertDialog.Builder(this).create(); and than add text and title to ad and show that. So no need to add title and text first to the builder and than show that builder properties into the dialog. This way is more simple and clear as it use just the AlertDialog and doesn't create a separate builder ;). – Asama May 04 '16 at 06:12
  • theOldTown No problem. Do note of @Asama 's comment. It'd help to reduce LOC. :) – AL. May 04 '16 at 06:13
  • i kept the whole code as it is and changed the last line in onPre ad = alert.show(); and then changed ad.setmessage Thanks.. –  May 04 '16 at 06:17
  • It is important to note that `ad.setMessage()` **won't work unless** at least you called his `AlertDialog.Builder` `alert.setMessage()` first with `""` input (`null` input won't work also). It is a known issue, see issue at [https://issuetracker.google.com/issues/36913966](https://issuetracker.google.com/issues/36913966) – Eido95 Jul 11 '17 at 18:49
0

In your code you forget to build alert dialog. See this

AlertDialog alertDialog = alert.create();
    alertDialog.show();

you have to create a alert dialog from private AlertDialog.Builder alert;

UserSharma
  • 458
  • 6
  • 20
  • It should be alert.create() as you are defining builder as alert and not alertdialogbuilder :) – Asama May 04 '16 at 06:16
  • @Asama the above code is an example code and the lower one the declaration from the question both of them are different code snippets – UserSharma May 04 '16 at 06:27
  • @Asama now I edit the answer according to the question's code – UserSharma May 04 '16 at 06:31
  • If you'd have used alertdialogbuilder.create() than it may have created confusion to those who are new to Android and Java. So if you say that he has to create dialog from the "alert" builder than it's better to use that to demonstrate the right implementation of the code you have provided ;). Hope you get it – Asama May 04 '16 at 07:22