Tôi đang cố gắng tìm hiểu lý do tại sao AsyncTask của Android cung cấp thông số qua execute
và tại sao việc truyền cho nhà xây dựng dường như không được thực hiện (trong tài liệu, ít nhất).Tôi có nên cung cấp thông số cho hàm tạo hoặc AsyncTask.execute (params) không?
Đây là cách mà dường như với tôi để làm cho ý nghĩa nhất (một cách tự nhiên, nhiệm vụ thực tế tôi đang làm việc với là nhiều hơn chỉ là một máy tính tổng hợp):
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);
}
}
này sẽ được sử dụng như sau:
new FooTask(progressBar, 1, 2, 3).execute();
Tuy nhiên, đây không phải là cách tài liệu thảo luận về việc thực hiện; nó sử dụng đối số cho execute()
, như thế này (đưa đến sự khắc nghiệt của không sử dụng một constructor ở tất cả, nhưng vẫn còn sử dụng một lĩnh vực bởi vì nếu không nó sẽ là quá khủng khiếp):
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);
}
}
Thi hành nhiệm vụ này sẽ xem xét thêm như thế này:
new FooTask().execute(progressBar, 1, 2, 3);
Một lựa chọn khác tôi coi được đưa ra các thanh tiến trình để các nhà xây dựng và các dữ liệu vào thực hiện cuộc gọi, nhưng sau đó tôi vẫn không thể sử dụng onPreExecute
như tôi không biết giá trị tối đa. (Tôi muốn sử dụng giá trị tối đa thực sự hơn là đặt giá trị tối đa tùy ý và tính tỷ lệ phần trăm ... có vẻ đẹp hơn.)
Số dư ở đâu? Tôi nên làm gì? Có bất kỳ điều gì sai bằng cách sử dụng hàm tạo không?
Bạn sẽ làm gì? Có thích hợp để vượt qua nó như thế không? –
Vì bạn cần 'onPreExecute()', tôi sẽ đi với phương thức tiếp cận đầu tiên của hàm dựng, nó đáp ứng yêu cầu và dễ đọc hơn. Bạn sẽ phải xem ra cho những thay đổi định hướng mặc dù. Vì các Hoạt động/Phân đoạn được tạo lại, Nhiệm vụ của bạn sẽ giữ nguyên tham chiếu cũ của thanh tiến trình nếu điều đó xảy ra, do đó thanh không nên cập nhật cho người dùng. –
Oh! Cho thấy tôi hiểu cách Android hoạt động trong nội bộ. Nó chưa bao giờ xảy ra với tôi để nghĩ khác hơn là họ sẽ là cùng một đối tượng trước và sau. Tôi thấy như vậy mà đi qua thanh tiến trình là * không * an toàn. Cảm ơn bạn đã xóa thông tin đó! –