Skip to content

ProgressDialog in AsyncTask: Dynamic Update max()

July 16th, 2015 - Software

Sometimes you determine the max of the progress bar in the background task. Unfortunately, there’s almost no way to transmit that to an UI thread-executed method like onProgressUpdate() (well, you could, but that’d be abusing the method). Instead you can do something like:

public class MyTask extends AsyncTask<Params, Progress, Result> {
    private ProgressDialog progressDialog;
    int max;
    int offset;

    @Override
    protected Void doInBackground(Params... params) {
        this.max = calculate_max();
        this.offset = 0;
        for (int i=0; i<this.max; i++) {
            // ...
            publishProgress(new Progress());
            // ...
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Result... values) {
        super.onProgressUpdate(values);
        this.progressDialog.setMessage(values[0].label);
        this.progressDialog.setProgress(
            calculateProgressPercent(this.offset, this.max)
        );
        this.offset ++;
    }

    private int calculateProgressPercent(int done, int max) {
        done = done * 100;
        return done / max;
    }

}

This way, the variables are updated in their own thread and the progress is advanced with a percentage.