Đối số nào được truyền vào AsyncTask <arg1, arg2, arg3>?


157

Tôi không hiểu những gì tôi phải đưa vào đây và những cuộc tranh luận này kết thúc ở đâu? Chính xác thì tôi nên đặt cái gì, và chính xác nó sẽ đi đâu? Tôi có cần bao gồm cả 3 hay tôi có thể bao gồm 1,2,20?

Câu trả lời:


496

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

Vâng 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ĩ 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

  1. Đừ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.

  2. 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.

  3. 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!).

  4. 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.


20
Anh chàng giải thích hoàn hảo
Kalai.G

30
Tốt hơn Google.
Diolor

25
+1. Các thành viên SO, hãy lưu ý. Đây là cách bạn giải thích. Mặc dù nó dài, nhưng nó cực kỳ dễ hiểu. Cảm ơn bạn Kartik.
Subby

3
Giải thích tốt đẹp, bây giờ tôi rất rõ về Asyntask. :) Cảm ơn Kartik
Reena

2
Điều đó đã xóa rất nhiều thứ cho tôi, câu trả lời tuyệt vời!
Michael

80

Tôi đến bữa tiệc quá muộn nhưng nghĩ rằng điều này có thể giúp được ai đó.


7
Hình ảnh này là vô cùng hữu ích. Tôi sẽ bắt đầu sử dụng nhiều hình ảnh như thế này để chỉ ra cách các Loại và các biến liên quan của chúng được gắn với nhau khi dòng mã không đơn giản hoặc kỹ thuật hoặc mẫu không phổ biến. Tôi hy vọng những người khác sẽ làm nhiều hơn về điều này. Cảm ơn
Kent Lauridsen

Hình ảnh đẹp, bạn có thể vui lòng thêm cho WeakAsyncTask không?
kAmol

1
@kAmol chắc chắn, tôi sẽ cố gắng để tạo ra một dòng chảy cho WeakAsyncTaskcũng
mrid

4
Một ngày nào đó tôi sẽ đóng khung nó và đặt nó lên tường của tôi để tôi không phải quay lại chủ đề này để tham khảo.
Matt Robertson

14

Giữ cho nó đơn giản!

An AsyncTasklà 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 AsyncTaskchữ ký chính xác sẽ là một miếng bánh.
Chỉ cần tìm ra Đầu vào , Tiến độĐầu ra của bạn là gì và bạn sẽ ổn.

Ví dụ: nhập mô tả hình ảnh ở đây

Trái tim của AsyncTask!

doInBackgound()phương pháp là phương pháp quan trọng nhất trong một AsyncTask

  • Chỉ có phương pháp này chạy trong luồng nền và xuất bản dữ liệu lên luồng UI.
  • Chữ ký của nó thay đổi với các AsyncTasktham số.

Vì vậy, hãy xem mối quan hệ

nhập mô tả hình ảnh ở đây

doInBackground()onPostExecute(), onProgressUpdate()cũng có liên quan

nhập mô tả hình ảnh ở đây

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");

1
// show in spinner, access UI elementschỉ là đưa ra lời giải thích đơn giản nhất cho onProgressUpdate(...):)
Volkan Güven

5

Tham khảo các liên kết sau:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

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


3
  • trong Short, có 3 tham số trong AsyncTask

    1. tham số cho việc sử dụng Đầu vào trong DoInBackground (Chuỗi ... params)

    2. 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 ...)

    3. 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]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.