tại sao, như thế nào và những tham số nào được truyền cho Asynctask <>, xem chi tiết tại đây . Tôi nghĩ đó là lời giải thích tốt nhất.
Tài liệu Android của Google nói rằng:
Một tác vụ không đồng bộ được xác định bởi 3 kiểu chung, được gọi là Tham số, Tiến trình và Kết quả, và 4 bước, được gọi là onPreExecute, doInBackground, onProgressUpdate và onPostExecute.
Các loại chung của AsyncTask:
Ba loại được sử dụng bởi một tác vụ không đồng bộ là:
Tham số, loại tham số được gửi đến tác vụ khi thực thi. Tiến độ, loại đơn vị tiến độ được xuất bản trong quá trình tính toán nền. Kết quả, loại kết quả của tính toán nền. Không phải tất cả các loại luôn được sử dụng bởi một tác vụ không đồng bộ. Để đánh dấu một loại là không sử dụng, chỉ cần sử dụng loại Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
Bạn có thể tham khảo thêm: http://developer.android.com/reference/android/os/AsyncTask.html
Hoặc Bạn có thể rõ vai trò của AsyncTask là gì bằng cách tham khảo Blog của Sankar-Ganesh
Cấu trúc của một lớp AsyncTask điển hình như sau:
private class MyTask extends AsyncTask<X, Y, Z>
protected void onPreExecute(){
}
Phương thức này được thực thi trước khi bắt đầu Thread mới. Không có giá trị đầu vào / đầu ra, vì vậy chỉ cần khởi tạo các biến hoặc bất cứ điều gì bạn nghĩ mình cần làm.
protected Z doInBackground(X...x){
}
Phương thức quan trọng nhất trong lớp AsyncTask. Bạn phải đặt ở đây tất cả những thứ bạn muốn làm trong nền, trong một chuỗi khác với chuỗi chính. Ở đây chúng ta có một giá trị đầu vào là một mảng các đối tượng từ kiểu “X” (Bạn có thấy trong tiêu đề không? Chúng ta có “... expand AsyncTask” Đây là các LOẠI tham số đầu vào) và trả về một đối tượng từ kiểu "Z".
được bảo vệ void onProgressUpdate (Y y) {
} Phương thức này được gọi bằng cách sử dụng phương thức PublishingProgress (y) và nó thường được sử dụng khi bạn muốn hiển thị bất kỳ tiến trình hoặc thông tin nào trên màn hình chính, chẳng hạn như thanh tiến trình hiển thị tiến trình của hoạt động bạn đang thực hiện trong nền.
void bảo vệ onPostExecute (Z z) {
} Phương thức này được gọi sau khi thực hiện xong thao tác chạy nền. Là một tham số đầu vào, bạn sẽ nhận được tham số đầu ra của phương thức doInBackground.
Còn loại X, Y và Z thì sao?
Như bạn có thể suy ra từ cấu trúc trên:
X – The type of the input variables value you want to set to the background process. This can be an array of objects.
Y – The type of the objects you are going to enter in the onProgressUpdate method.
Z – The type of the result from the operations you have done in the background process.
Làm thế nào để chúng ta gọi nhiệm vụ này từ một lớp bên ngoài? Chỉ với hai dòng sau:
MyTask myTask = new MyTask();
myTask.execute(x);
Trong đó x là tham số đầu vào của kiểu X.
Khi nhiệm vụ của mình đang chạy, chúng ta có thể tìm hiểu trạng thái của nó từ “bên ngoài”. Sử dụng phương thức "getStatus ()".
myTask.getStatus (); và chúng tôi có thể nhận được trạng thái sau:
RUNNING - Cho biết tác vụ đang chạy.
PENDING - Cho biết tác vụ chưa được thực hiện.
FINISHED - Cho biết onPostExecute (Z) đã kết thúc.
Gợi ý về cách sử dụng AsyncTask
Không gọi các phương thức onPreExecute, doInBackground và onPostExecute theo cách thủ công. Việc này do hệ thống tự động thực hiện.
Bạn không thể gọi AsyncTask bên trong AsyncTask hoặc Thread khác. Việc gọi phương thức thực thi phải được thực hiện trong Chuỗi giao diện người dùng.
Phương thức onPostExecute được thực thi trong Chuỗi giao diện người dùng (ở đây bạn có thể gọi một AsyncTask khác!).
Các tham số đầu vào của tác vụ có thể là một mảng Đối tượng, bằng cách này, bạn có thể đặt bất kỳ đối tượng và kiểu nào bạn muốn.