Giới thiệu về Kotlin Coroutines
Coroutine là một mẫu thiết kế đồng thời mà bạn có thể sử dụng trên Android để đơn giản hóa mã thực thi không đồng bộ.
Coroutines = Co + Routines
Ở đây, Co nghĩa là hợp tác và Routines nghĩa là chức năng.
Trong các chương trình không đồng bộ , nhiều tác vụ thực thi song song trên các luồng riêng biệt mà không cần đợi các tác vụ khác hoàn thành. Chủ đề là một nguồn tài nguyên đắt tiền và quá nhiều chủ đề dẫn đến chi phí hoạt động do mức tiêu thụ bộ nhớ và mức sử dụng CPU cao.
Các thuộc tính của Coroutines là gì?
- Trọng lượng nhẹ : Bạn có thể chạy nhiều coroutine trên một luồng nhờ hỗ trợ cho hệ thống treo , điều này không chặn luồng mà coroutine đang chạy. Tạm dừng tiết kiệm bộ nhớ hơn chặn trong khi hỗ trợ nhiều hoạt động đồng thời.
- Ít rò rỉ bộ nhớ hơn : Sử dụng đồng thời có cấu trúc để chạy các hoạt động trong một phạm vi.
- Hỗ trợ hủy tích hợp : Việc hủy được truyền tự động thông qua hệ thống phân cấp coroutine đang chạy.
- Tích hợp Jetpack : Nhiều thư viện Jetpack bao gồm các tiện ích mở rộng cung cấp hỗ trợ coroutines đầy đủ. Một số thư viện cũng cung cấp phạm vi quy trình đăng ký riêng mà bạn có thể sử dụng cho đồng thời có cấu trúc.
Việc thêm vào phần phụ thuộc “build.gradle(Module:App.app)” được thực hiện như sau.
Phạm vi Coroutine và Trình xây dựng
Trình tạo coroutine là các hàm giúp chúng ta tạo một coroutine. Chúng có thể được gọi từ các chức năng bình thường vì chúng không tự đình chỉ. Ba trình tạo coroutine được liệt kê bên dưới.
runBlocking : Tạo một chức năng coroutines mới và cho đến khi hoàn thành để chặn luồng chính.
launch : Đó là một chức năng xây dựng không chặn luồng mà nó đang chạy và trả về đối tượng Công việc. Để sử dụng chức năng này, chúng ta cần phải ở trong phạm vi Coroutine.
async : Đó là trình xây dựng coroutine trả về một số giá trị cho người gọi. async có thể được sử dụng để thực hiện một tác vụ không đồng bộ trả về một giá trị. Giá trị này theo thuật ngữ của Kotlin là giá trị Trì hoãn<T>.
Sự khác biệt khởi chạy và không đồng bộ là gì?
Sự khác biệt GlobalScope và runBlocking là gì?
GlobalScope độc lập và tiếp tục chạy ngay cả khi luồng kết thúc. Nó chạy xuyên suốt toàn bộ vòng đời của ứng dụng.
Như trong đoạn mã trên, GlobalScope tiếp tục chạy ngay cả khi luồng kết thúc.
Chức năng Đình chỉ là gì?
Viết hàm Suspend cũng giống như viết hàm bình thường. Sự khác biệt duy nhất là chúng chỉ bắt đầu bằng cách tìm nạp từ khóa treo. Bên trong coroutines là các chức năng có thể chạy được. Chức năng tạm dừng là một chức năng có thể được bắt đầu, tạm dừng và tiếp tục. Một trong những điểm quan trọng nhất cần nhớ về các hàm treo là chúng chỉ được phép gọi từ một coroutine hoặc một hàm treo khác.
Sử dụng chức năng khởi chạy , một coroutine mới được bắt đầu đồng thời với phần còn lại của mã.
runBlocking cũng bắt đầu một coroutine mới.
Trong thời gian runBlocking , luồng hiện tại: main bị chặn cho đến khi tất cả mã trong phần thân của hàm được thực thi.
Các chức năng tạm ngưng được gọi là chức năng runningTask .
Nó tạm dừng coroutine mà không chặn luồng bên dưới nhưng cho phép các coroutine khác chạy và sử dụng luồng bên dưới cho mã của chúng.
Bộ điều phối Coroutine là gì?
Coroutine Dispatcher là cấu trúc quyết định thread mà coroutine sẽ chạy trên đó.
Chúng ta có thể nghĩ rằng các bộ điều phối tương ứng với đối tượng bộ lập lịch trong các khung phản ứng (ví dụ: rxJava).
Được biết, coroutine luôn được bắt đầu trong một ngữ cảnh cụ thể và ngữ cảnh đó mô tả luồng mà coroutine sẽ được bắt đầu. Nói chung, chúng ta có thể khởi động coroutine bằng GlobalScope mà không cần chuyển bất kỳ tham số nào cho nó, điều này được thực hiện khi chúng ta không chỉ định chuỗi mà quy trình đăng ký sẽ được khởi chạy. Phương pháp này không cung cấp cho chúng tôi nhiều quyền kiểm soát đối với nó, vì coroutine của chúng tôi có thể được khởi chạy trong bất kỳ luồng nào có sẵn, do đó không thể dự đoán luồng mà coroutine của chúng tôi đã được khởi chạy.
Có 4 loại Dispatcher chủ yếu.
- Điều phối viên chính
- Bộ điều phối IO
- Bộ điều phối mặc định
- Bộ điều phối không giới hạn
- Dispatchers.Main — Sử dụng bộ điều phối này để chạy một quy trình đăng ký trên luồng chính của Android. Điều này chỉ nên được sử dụng để tương tác với giao diện người dùng và thực hiện công việc nhanh chóng. Các ví dụ bao gồm gọi các chức năng tạm dừng , chạy các hoạt động của khung giao diện người dùng Android và cập nhật
LiveDatacác đối tượng. - Dispatchers.IO — Bộ điều phối này được tối ưu hóa để thực hiện I/O của đĩa hoặc mạng bên ngoài luồng chính. Các ví dụ bao gồm sử dụng thành phần Phòng , đọc hoặc ghi vào tệp và chạy bất kỳ hoạt động mạng nào.
- Dispatchers.Default — Bộ điều phối này được tối ưu hóa để thực hiện công việc sử dụng nhiều CPU bên ngoài luồng chính. Các trường hợp sử dụng ví dụ bao gồm sắp xếp danh sách và phân tích cú pháp JSON.
Tài nguyên

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































