tại sao, như thế nào và trong đó các tham số được truyền cho AsyncTask <>, xem chi tiết here. 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 nhiệm vụ không đồng bộ được xác định bởi 3 loại chung chung, gọi là Params, Tiến độ và kết quả, và 4 bước, gọi onPreExecute, doInBackground, onProgressUpdate và onPostExecute.
kiểu generic AsyncTask của:
Ba loại được sử dụng bởi một nhiệm vụ không đồng bộ như sau:
Params, loại các thông số gửi đến nhiệm vụ khi thực hiện. Tiến trình, loại đơn vị tiến trình đượ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 tác vụ không đồng bộ. Để đánh dấu một kiểu như là không sử dụng, bạn chỉ cần sử dụng các loại Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
Bạn thêm có thể tham khảo: http://developer.android.com/reference/android/os/AsyncTask.html
Hoặc bạn có thể xóa whats vai trò của AsyncTask bởi đề cập Blog Sankar-Ganesh của
Vâng Cấu trúc của 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 hiện trước khi bắt đầu chuỗi mới. Không có giá trị đầu vào/đầu ra, do đó, chỉ cần khởi tạo biến hoặc bất cứ điều gì bạn nghĩ rằng bạn cần phải làm.
protected Z doInBackground(X...x){
}
Phương pháp 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 chủ đề khác với chủ đề chính. Ở đây chúng ta có 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ó “... mở rộng AsyncTask” Đây là các LOẠI của các tham số đầu vào) và trả về một đối tượng từ kiểu “Z”.
protected void onProgressUpdate (Y y) {
} Phương pháp này được gọi là sử dụng publishProgress phương pháp (y) và nó thường được sử dụng khi bạn muốn hiển thị bất kỳ tiến bộ hoặc thông tin trong màn hình chính, giống như một thanh tiến trình hiển thị tiến độ của thao tác bạn đang làm trong nền.
protected void onPostExecute (Z z) {
} Phương pháp này được gọi là sau khi hoạt động ở chế độ nền được thực hiện. Là một tham số đầu vào, bạn sẽ nhận được thông số đầu ra của phương thức doInBackground.
Còn các 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 là 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 các loại X.
Một khi chúng ta có nhiệm vụ chạy của chúng tôi, chúng tôi có thể tìm hiểu tình trạng 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.
ĐANG CHỜ - Cho biết tác vụ chưa được thực thi.
HOÀN THÀNH - Cho biết rằng onPostExecute (Z) đã hoàn tất.
gợi ý về việc sử dụng AsyncTask
Đừng gọi các phương pháp onPreExecute, doInBackground và onPostExecute bằng tay. Việc này được hệ thống tự động thực hiện.
Bạn không thể gọi AsyncTask bên trong AsyncTask hoặc Chủ đề khác. Cuộc gọi của phương thức thực hiện phải được thực hiện trong Thread UI.
Phương thức onPostExecute được thực thi trong Chủ đề giao diện người dùng (tại đâ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, theo cách này bạn có thể đặt bất kỳ đối tượng và loại nào bạn muốn.
Điều này hoàn toàn chính xác những gì tôi đã làm bây giờ. Tôi vẫn cần một biến thành viên nhưng trong AsyncTask và không phải là lớp bên ngoài nếu đó là những gì bạn có ý nghĩa. Đây là những gì tôi đã làm: lớp riêng MyAsyncTask mở rộng AsyncTask { riêng boolean showLoading; công khai MyAsyncTask (boolean showLoading) { super(); this.showLoading = showLoading; // do stuff } protected void onPreExecute() { if (showLoading) {// ... }} // doInBackground() et al. } –
Yup, đó là khá nhiều ý tưởng :) – Felix
Đây là câu trả lời đúng –