Câu trả lời:
Tài liệu Android của Google cho biết:
Một tác vụ không đồng bộ được xác định bởi 3 loại chung, được gọi là Params, Tiến trình và Kết quả và 4 bước, được gọi là onPreExecute, doInBackground, onProTHERUpdate 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ộ như sau:
Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.
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ể xóa vai trò của AsyncTask bằng cách giới thiệu Blog của Sankar-Ganesh
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ĩ bạn 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 chủ đề khác với chủ đề 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 X (Bạn có thấy trong tiêu đề không? Chúng ta có ... mở rộng AsyncTask, Đây là các TYPES của các tham số đầu vào) và trả về một đối tượng từ loại NỀN Z
protected void onProgressUpdate(Y y){
}
Phương thức này được gọi bằng cách sử dụng phương thức PublishProTHER (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 trong màn hình chính, như thanh tiến trình hiển thị tiến trình của thao tác bạn đang thực hiện trong nền.
protected void onPostExecute(Z z){
}
Phương pháp này được gọi sau khi thao tác trong nền được thực hiệ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 các loại X, Y và Z thì sao?
Như bạn có thể suy luận 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 loại X.
Khi chúng tôi có nhiệm vụ của mình, chúng tôi 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 của get get getatat ().
myTask.getStatus();
và chúng ta có thể nhận được trạng thái sau:
CHẠY - Cho biết tác vụ đang chạy.
PENDING - Cho biết rằng tác vụ chưa được thực hiện.
HOÀN TẤT - Cho biết onPostExecute (Z) đã kết thúc.
Gợi ý về việc sử dụng AsyncTask
Đừng gọi các phương thức onPreExecute, doInBackground và onPostExecute theo cách thủ công. Điều này được tự động thực hiện bởi hệ thống.
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 thi phải được thực hiện trong UI Thread.
Phương thức onPostExecute được thực thi trong UI Thread (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 Object, 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.
WeakAsyncTask
cũng
An AsyncTask
là tác vụ nền chạy trong luồng nền. Nó nhận một Đầu vào , thực hiện Tiến trình và đưa ra Đầu ra .
tức
AsyncTask<Input,Progress,Output>
.
Theo tôi, nguồn gây nhầm lẫn chính xuất hiện khi chúng ta cố gắng ghi nhớ các tham số trong AsyncTask
.
Điều quan trọng là đừng ghi nhớ .
Nếu bạn có thể hình dung những gì nhiệm vụ của bạn thực sự cần làm thì viết AsyncTask
chữ ký chính xác sẽ là một miếng bánh.
Chỉ cần tìm ra Đầu vào , Tiến độ và Đầu ra của bạn là gì và bạn sẽ ổn.
doInBackgound()
phương pháp là phương pháp quan trọng nhất trong một AsyncTask
vì
AsyncTask
tham số.Vì vậy, hãy xem mối quan hệ
doInBackground()
vàonPostExecute()
,onProgressUpdate()
cũng có liên quan
Cho tôi xem mã
Vậy tôi sẽ viết mã cho DownloadTask như thế nào?
DownloadTask extends AsyncTask<String,Integer,String>{
@Override
public void onPreExecute()
{}
@Override
public String doInbackGround(String... params)
{
// Download code
int downloadPerc = // calculate that
publish(downloadPerc);
return "Download Success";
}
@Override
public void onPostExecute(String result)
{
super.onPostExecute(result);
}
@Override
public void onProgressUpdate(Integer... params)
{
// show in spinner, access UI elements
}
}
Làm thế nào bạn sẽ chạy nhiệm vụ này
new DownLoadTask().execute("Paradise.mp3");
// show in spinner, access UI elements
chỉ là đưa ra lời giải thích đơn giản nhất cho onProgressUpdate(...)
:)
Tham khảo các liên kết sau:
Bạn không thể truyền nhiều hơn ba đối số, nếu bạn chỉ muốn truyền 1 đối số thì sử dụng void cho hai đối số còn lại.
1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
2. protected class InitTask extends AsyncTask<Context, Integer, Integer>
Một tác vụ không đồng bộ được xác định bởi một tính toán chạy trên luồng nền và kết quả được công bố trên luồng UI. Một tác vụ không đồng bộ được xác định bởi 3 loại chung, được gọi là Params, Tiến trình và Kết quả và 4 bước, được gọi là onPreExecute, doInBackground, onProTHERUpdate và onPostExecute.
KPBird
trong Short, có 3 tham số trong AsyncTask
tham số cho việc sử dụng Đầu vào trong DoInBackground (Chuỗi ... params)
các tham số để hiển thị trạng thái sử dụng tiến trình trong OnProTHERUpdate (trạng thái Chuỗi ...)
tham số để sử dụng kết quả trong OnPostExcute (Chuỗi ... kết quả)
Lưu ý: - [Loại tham số có thể thay đổi tùy theo yêu cầu của bạn]