Czy powinienem podać params dla konstruktora lub AsyncTask.execute (params)?

Próbuję dowiedzieć się, dlaczego AsyncTask Androida daje parametry przezexecute i dlaczego przejście do konstruktora nie wydaje się być wykonane (przynajmniej w dokumentach).

Jest to sposób, który wydaje mi się najbardziej sensowny (oczywiście, rzeczywiste zadanie, z którym pracuję, jest czymś więcej niż tylko kalkulatorem sumy):

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

Zostanie to użyte w ten sposób:

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

Jednak w ten sposób dokumentacja nie mówi o tym; używa argumentów doexecute(), w ten sposób (na skraju nieużywania konstruktora, ale nadal używającego jednego pola, ponieważ w przeciwnym razie byłoby zbyt straszne):

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

Wykonanie tego zadania wyglądałoby bardziej tak:

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

Jedną z rozważanych przeze mnie opcji było podanie paska postępu konstruktorowi i danych do wywołania wykonywania, ale nadal nie mogę go użyćonPreExecute ponieważ nie znam maksymalnej wartości. (Wolałbym użyć prawdziwego maksimum niż dowolnie ustawiać wartość maksymalną i obliczać procent ... po prostu wydaje się ładniejszy.)

Gdzie jest równowaga? Co powinienem zrobić? Czy jest cokolwiekźle z użyciem konstruktora?

questionAnswers(3)

yourAnswerToTheQuestion