我试图弄清楚为什么 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);
我考虑的另一种选择是将进度条提供给构造函数并将数据提供给执行调用,但是我仍然无法使用onPreExecute
,因为我不知道最大值。(我宁愿使用真正的最大值,而不是任意设置最大值并计算百分比......看起来更好。)
余额在哪里?我应该怎么办?使用构造函数有什么问题吗?