Hỏi về AsyncTask trong Android

Mấy hôm nay em đọc về AsyncTask mà đầu cứ u mê.

Async Task chủ yếu dùng để làm gì ?
Sao các tuts về AsynCTask lại thường tạo 1 class extends AsyncTask ngay trong main class ?
Và String…params ? How to truyền dữ liệu vào đó ? Và 3 cái Parameters trong <> khi extends.

mong mọi người giúp :((

http://developer.android.com/reference/android/os/AsyncTask.html
Em vào đây đọc thử đi, anh thấy nó nói rất rõ ràng rồi mà.

em đọc tiếng anh rồi. nhưng đầu e dịch ra lủng củng. hiểu không rõ ràng.

nhất là về 3 cái parameters và String…params :frowning:

Anh giải thích sơ quá một chút:

  1. AsyncTask dùng để làm gì:
  • Trong Android, đôi khi chúng ta sẽ thực hiện một số operation mà thời gian từ lúc gửi request đến lúc nhận response có thể hơi lâu như network operation: download ảnh, down phim…; database query, lấy thông tin danh sách ứng dụng trong hệ điều hành, gửi file bluetooth… Người ta hay gọi chúng là Background operations.
  • Main Thread (thread dùng để update giao diện) thì thực thi công việc theo cơ chế hàng đợi FIFO, do đó nếu em thực hiện background operation bằng main thread sẽ dẫn tới hiện tượng đơ, treo màn hình do công việc sau muốn chạy phải đợi công việc trước được thực hiện xong.

Vậy nên Google làm ra AsyncTask để thực hiên background operation. Không dùng Main Thread nữa.

  1. Tại sao lại extends AsyncTask:
    -AsyncTask là abstract class, nó chưa implement cho em cái gì cả. Nên nếu em muốn thực hiện một công việc nào đó bằng AsyncTask em phải extends nó và tạo một class cụ thể. Còn viết ở đâu thì tùy vào mục đích sử dụng. Em tách ra class riêng cũng được mà để nó làm inner class cũng được.

  2. String… params:
    -Cái này trong java gọi là vargars. Tức là em có thể truyền vào nhiều tham số có kiểu dữ liệu là String (thay String bằng Integer, hoặc Long… cũng được). Thường dùng trong trường hợp em chưa biết được số lượng tham số cụ thể cần truyền vào là bao nhiêu.

  3. Ba cái parametres trong <> là gì?
    -Trong ví dụ có đoạn khai báo

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>

  • URL: Chỗ này là kiểu dữ liệu em muốn truyền vào trước khi chạy AsyncTask.
  • Integer: là kiểu dữ liệu trả về trong khi đang chạy AsyncTask: ví dụ như số % phim đã được download…
  • Long: là kiểu dữ liệu trả về khi chạy xong AsyncTask.

Truyền vào thì ta làm như sau:
new DownloadFilesTask().execute(url1, url2, url3);
url1, url2, url3 có kiểu dữ liệu là URL. Chính là vargars anh nói ở trên.

Em muốn làm Android thì phải vững Java core, đó là điều bắt buộc. Không vững Java thì không vững Android. Không vững Android chưa chắc đã không vững Java :smile_cat:

10 Likes

:+1: Cho nên quay về làm sub nốt Java core mau @Sky :sunglasses:

Khi muốn cập nhật UI nhưng tác vụ ngắn thì bạn sử dụng Handler, còn những công việc đòi hỏi thời gian lâu hơn thì nên dùng AsyncTask.

Bạn nhìn hình dưới đây để hiểu cách truyền vào các tham số và ý nghĩa của nó nhé.

2 Likes

tuân chỉ :smiley: :smile:

1 Like

Khắc cốt ghi tâm lời anh dạy :blush:

Bổ sung xíu cho bạn @Hnib :smile:
Bây giờ ví dụ như ta muốn thực hiện việc download một tấm ảnh từ internet bằng URL thông thường.
Trong main ta có thể dùng new MyTask().execute(“URL ảnh”);
Khi khởi động async này thì URL ảnh sẽ truyền vào <String, Integer, JsonObject>
String này dùng trong doInBackGround và thực hiện download trong hàm này, việc update giao diện ta thực hiện trong onPostExecute

4 Likes

Trong Android tồn tại một thread chính được gọi là MainUIThread. Trong Android sử dụng cơ chế Looper/Message để thực thi và quản lí luồng xử lí dẫn đến Thread này không được phép có những tác dụng phụ kiểu làm đơ màn hình.
Lúc này nền tảng Android yêu cầu người dùng (người dùng nền tảng hiểu là dev và những người như dev) implement code ở các thread khác để tránh ảnh hưởng đến MainUIThread. Nếu em để ý thì để giao tiếp giữa hai thread rất khó khăn, chưa kể các effect như bất đồng bộ, blad blad…
Android sử dụng một cơ chế để các thread khác giao tiếp với MainUIThread là Handle. Cách làm này giúp hạn chế vấn đề bất đồng bộ tuy nhiên lại gặp phải vấn đề lớn.
Thread khác muốn làm việc với view nhưng view lại chết theo Activity quản lí nó rồi thì phải làm sao?
Lúc này Android sinh ra một cơ chế gọi là AsyncTassk để giải quyết vấn đề này.

6 Likes

Cái ảnh này cực hay luôn, nhìn cái là bao nhiêu thứ nó tuôn ra :smile:

cho em hỏi java core có phải mấy cái thư viện như .lang, .io… ko ạ ?

The issue deleted…

Thật sự đây là hệ quả của việc học theo kiểu ăn xổi/đi tắt nên xuất hiện nhiều lỗ hổng kiến thức, lỗ hổng tư duy, không vận dụng được cái mình đã học để giải quyết các bài toán phức tạp hơn.
Muốn lấy/xử lí giá trị result ở ngoài method onPostExecute thì chỉ việc truyền object này cho 1 method của 1 object khác trong method onPostExecute thôi

Bạn cho mình hỏi. Khi activity khởi chạy asyntask. nhưng trong khi asyntask đang chạy mà activity bị chết hoặc chuyển về background. thì asyntask lúc này có còn chạy hay không. và sau khi user quay lại activity thì asyntask lúc nào sẽ ntn.
Mình cảm ơn

asyntask vẫn chạy nhé. Khi User quay lại activity thì 1 asyntask mới được execute.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?