30/09/2018, 17:57

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 :((

viết 20:04 ngày 30/09/2018

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

Điệp viết 20:06 ngày 30/09/2018

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

viết 19:58 ngày 30/09/2018

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

TTmagic viết 20:04 ngày 30/09/2018

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

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

Hnib viết 20:06 ngày 30/09/2018

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

Điệp viết 20:01 ngày 30/09/2018

tuân chỉ

Điệp viết 20:06 ngày 30/09/2018

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

X viết 20:08 ngày 30/09/2018

Bổ sung xíu cho bạn @Hnib
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

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.

Điệp viết 20:10 ngày 30/09/2018

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

hoangtuan viết 20:10 ngày 30/09/2018

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

bongtoi viết 20:04 ngày 30/09/2018

The issue deleted…

Quân viết 20:13 ngày 30/09/2018

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

Dương Nguyễn Văn viết 20:10 ngày 30/09/2018

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

Truong Pham viết 20:13 ngày 30/09/2018

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

Bài liên quan
0