¿Debo dar parámetros al constructor o a AsyncTask.execute (params)?

Estoy tratando de averiguar por qué AsyncTask de Android proporciona parámetros a través deexecute y por qué pasar entonces al constructor no parece estar hecho (al menos en los documentos).

Esta es la forma en que me parece que tiene más sentido (naturalmente, la tarea real en la que estoy trabajando es más que una simple calculadora de suma):

public class FooTask extends AsyncTask<Void, Integer, Long> {
    private ProgressBar progressBar;
    private int[] data;

    public FooTask(ProgressBar progressBar, int... data) {
        this.progressBar = progressBar;
        this.data = data;
    }

    protected void onPreExecute() {
        progressBar.setMax(data.length);
        progressBar.setProgress(0);
    }

    protected Long doInBackground(Void... _) {
        long sum = 0;
        for (int i = 0; i < data.length; i++) {
            sum += data[i];
            publishProgress(i);
        }
        return sum;
    }

    protected void onProgressUpdate(Integer... progress) {
        progressBar.setProgress(progress[0]);
    }

    protected void onPostExecute(Long result) {
        Log.i(TAG, "Sum: " + result);
    }
}

Esto sería utilizado así:

new FooTask(progressBar, 1, 2, 3).execute();

Sin embargo, esta no es la forma en que la documentación habla de hacerlo; usa argumentos paraexecute(), así (llevado al extremo de no usar un constructor en absoluto, pero seguir usando un campo porque de lo contrario sería demasiado horrible):

public class FooTask extends AsyncTask<Object, Integer, Long> {
    private ProgressBar progressBar;
    private boolean isMaxSettingUpdate = true;

    protected Long doInBackground(Object... params) {
        progressBar = params[0];
        long sum = 0;
        for (int i = 1; i < data.length; i++) {
            sum += (int) data[i];
            publishProgress(i - 1, data.length);
        }
        return sum;
    }

    protected void onProgressUpdate(Integer... progress) {
        progressBar.setMax(progress[1]);
        progressBar.setProgress(progress[0]);
    }

    protected void onPostExecute(Long result) {
        Log.i(TAG, "Sum: " + result);
    }
}

La ejecución de esta tarea se vería más así:

new FooTask().execute(progressBar, 1, 2, 3);

Otra opción que consideré fue darle la barra de progreso al constructor y los datos a la llamada de ejecución, pero aún no puedo usaronPreExecute Como no sé el valor máximo. (Preferiría usar un verdadero máximo en lugar de establecer el valor máximo de forma arbitraria y calcular el porcentaje ... parece más agradable).

¿Dónde está el equilibrio? ¿Qué tengo que hacer? Hay algoincorrecto ¿Con usar el constructor?

Respuestas a la pregunta(3)

Su respuesta a la pregunta