- vừa được xem lúc

Dispatchers trong Kotlin Coroutines

0 0 25

Người đăng: Nguyễn Nam Anh

Theo Viblo Asia

Dispatcher là cái gì?

Hiểu một cách đơn giản, Dispatcher sẽ quyết định xem Coroutines được thực thi trên thread nào. Có thể là main thread, background thread, hoặc nó đẩy Coroutines vào thread pool.

Có 4 loại Dispatchers:

  • Dispatchers.Default
  • Dispatchers.Main
  • Dispatchers.IO
  • Dispatchers.Unconfined

Hoặc bạn có thể tự tạo Dispatchers cho riêng mình bằng function newSingleThreadContext() hoặc newFixedThreadPoolContext().

Các function để build Coroutines như launchasync đều có một param là CoroutinesContext để chúng ta truyền Dispatchers vào, vì mấy thằng Dispatchers ở trên đều extends từ CoroutinesContext.

launch(Dispatchers.Default) { println("I'm working in thread ${Thread.currentThread().name}")
}

Còn khi mà chúng ta gọi launch với async mà không truyền param CoroutinesContext, nó sẽ kế thừa context của CoroutineScope mà nó được khởi chạy.

fun main() = runBlocking<Unit> { launch { println("I'm working in thread ${Thread.currentThread().name}") }
}

Ở trong ví dụ này, nó sẽ kế thừa context của runBlocking nên sẽ thực thi trên main thread.

Bây giờ, chúng ta sẽ đi tìm hiểu chi tiết từng loại Dispatchers nhé.

Dispatchers.Default

Dispatchers.Default được dùng mặc định bởi các builder function launchasync nếu như chúng ta không gán Dispatchers nào khác cho nó. Default Dispatchers dùng một shared background threads pool. Vì vậy chúng ta có thể dùng Dispatchers.Default cho những công việc tốn nhiều CPU. Ví dụ:

  • Các tác vụ nặng như tính toán ma trận
  • Sort, filter hoặc search một cái list siêu to khổng lồ trên bộ nhớ
  • Các tác vụ với Bitmap trên bộ nhớ
  • Parse JSON trên bộ nhớ

Mặc định, số lượng thread nhiều nhất được Dispatchers.Default dùng sẽ bằng với số CPU core, nhưng ít nhất là 2.

Dispatchers.Main

Bạn nghe tên là đoán được rồi đúng không? Chính xác, Dispatchers.Main sẽ thực thi trên main thread, nó phù hợp với các tác vụ tương tác với UI.

Thông thường thì Dispatchers.Main sẽ là single thread.

Dispatchers.IO

Nghe nhạc hiệu đoán được chương trình tiếp này. Dispatchers.IO dùng một shared pool gồm các thread được tạo theo nhu cầu. Nó giúp giảm tải các tác vụ blocking IO. Vì vậy nó phù hợp với các tác vụ liên quan đến disk và network. Ví dụ:

  • Gọi API
  • Download file từ server
  • Move 1 file từ folder này đến folder khác trên disk
  • Đọc ghi file
  • Query database
  • Loading Shared Preferences

Số lượng thread được sử dụng bởi Dispatchers.IO được giới hạn bởi 64 hoặc số lượng core (tuỳ xem số nào lớn hơn).

Dispatchers.Unconfined

Mình gọi Dispatchers.Unconfined là con ngựa bất kham, vì mình sẽ không biết nó được thực thi trên thread nào.

Ban đầu, khi khởi chạy, Coroutines sẽ được thực thi trên chính thread gọi nó. Nhưng sau khi bị suspend, và resume, nó sẽ thực thi trên một thread khác, được quyết định bởi suspend functions được gọi. Dispatchers.Unconfined phù hợp với những công việc không tiêu tốn CPU và không update UI. Nhưng bản thân Kotlin document cũng nhấn mạnh là:

The Unconfined dispatcher should not normally be used in code.

Tạm dịch: Bình thường không ai dùng dispatcher Unconfined trong code cả.

newSingleThreadContext

Function này sẽ tạo một thread mới cho chúng ta tha hồ vùng vẫy. Nhưng thật sự thì việc tạo một thread mới tốn rất nhiều resource, và bạn phải tự gọi function close để giải phóng nó khi không dùng nữa. Vậy nên trong thực tế, mình khuyến nghị các bạn không nên dùng cách này.

Ngoài ra còn có newFixedThreadPoolContext để tạo một thread pool với size cố định.

So sánh với RxJava, RxAndroid

Chúng ta có thể thấy Dispatchers tương tự như Schedulers trong RxJava.

Coroutines RxJava RxAndroid
Dispatchers.Default Schedulers.computation()
Dispatchers.Main AndroidSchedulers.mainThread()
Dispatchers.IO Schedulers.io()

Lời kết

Tựu chung lại, Dispatchers là một khái niệm quan trọng trong Coroutines, vậy nên các bạn cần nắm chắc về nó để có thể chọn một Dispatchers phù hợp cho từng function của mình.

Reference

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 281

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 206

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 107

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 98

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 68

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 315