我試圖弄清楚爲什麼Android的AsyncTask通過execute
給出參數以及爲什麼傳遞給構造函數似乎沒有完成(至少在文檔中)。我應該給構造函數還是參數AsyncTask.execute(params)?
這是在我看來,最有意義的方式(當然,我的工作實際任務不僅僅是一個和運算更多):
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();
但是,這不是文檔談論做這件事的方式;它使用參數,像這樣(注意不要使用構造所有,但仍然使用一個字段,因爲否則它會是太可怕了極端):
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
,因爲我不知道最大值其他選項。 (我寧願使用真正的最大值,而不是任意設置最大值並計算百分比......只是看起來更好。)
餘額在哪裏?我該怎麼辦?使用構造函數有什麼錯誤?
你會如何去進度條的事情嗎?這樣傳遞是否合適? –
既然你確實需要'onPreExecute()',我會用你的第一個,只有構造函數的方法,它滿足要求,它更容易閱讀。儘管如此,你將不得不注意方位的變化。由於活動/片段確實被重新創建,如果發生這種情況,您的任務將保留進度條的舊引用,所以欄不應該爲用戶更新。 –
哦!顯示了我對Android的內部工作原理的瞭解。我從來沒有想過除了他們在前後會是同一個對象之外。因此,我看到通過進度條*不安全。感謝您的清除! –