Я пытаюсь понять, почему Android AsyncTask предоставляет параметры через execute
и почему передача затем в конструктор, похоже, не выполняется (в документах, по крайней мере).
Именно так мне кажется наиболее разумным (естественно, фактическая задача, с которой я работаю, - это больше, чем просто калькулятор суммы):
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);
}
}
Это будет использоваться таким образом:
new FooTask(progressBar, 1, 2, 3).execute();
Однако это не так, как документация говорит об этом; он использует аргументы для execute()
, как это (в крайнем случае не использует конструктор вообще, но все равно использует одно поле, потому что иначе это было бы слишком ужасно):
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);
}
}
Выполнение этой задачи будет выглядеть примерно так:
new FooTask().execute(progressBar, 1, 2, 3);
Еще один вариант, который я рассмотрел, - это предоставить индикатор выполнения конструктору и данным для вызова execute, но я все еще не могу использовать onPreExecute
, поскольку я не знаю максимальное значение. (Я бы предпочел использовать истинный макс, а не устанавливать максимальное значение произвольно и вычислять процент... просто кажется приятнее.)
Где баланс? Что мне делать? Что-то не так с использованием конструктора?