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

Đưa work xuống background với Coroutines trong Android

0 0 34

Người đăng: Dang Anh Quan

Theo Viblo Asia

Giới thiệu

Coroutines giờ đã không còn xa lạ với dev android nữa, nhưng liệu chúng ta đã dùng đc hết các công dụng nó mang lại ngoài việc dùng để gọi api với retrofit hay truy cập db với room, nhiều khi chúng ta mới chỉ hiểu nó có tính năng nhưng chưa biết áp dụng vào đâu khi dev Android. Vậy hãy cùng bàn trong bài này nhé.

Thực hiện

Khái niệm 60fps nghĩa là system sẽ redraw activity mỗi một khoảng th gian để đạt đc 60 frame per second, nghĩa là mỗi frame sẽ được vẽ trong khoảng 1 / 60 sec ~ 16 ms. App sẽ cần thực hiện các logic update trên main threadsao cho vừa đủ dưới 16ms. Nếu app của bạn thực hiện quá nhiều việc trên main thread như vừa tạo view, tính toán logic thì khả năng mỗi frame sẽ tốn hơn 16ms, khi đó sẽ xảy ra hiện tượng drop frame. Việc thời gian cho mỗi frame càng lâu thì càng dễ bị nhận ra qua việc thấy app bị lag, giật. Nếu app của bạn có animation thì việc drop frame càng nhận thấy rõ hơn khi animation ko mượt mà.

Và dưới đây là một đoạn log điển hình cho việc frame bị drop

Skipped 55 frames! The application may be doing too much work on its main thread.

Vậy chúng ta có thể làm gì? Hãy cố gắng đưa tất cả các job cần tính toán nhiều lên server, những logic buộc phải tính toán ở app hãy đưa xuống background. Khi chưa có coroutines thì việc quản lý thread thủ công sẽ khá tốn thời gian và dễ xảy ra lỗi nếu không xử lý tốt, bù lại cho chúng ta khả năng tuỳ chỉnh lớn. Hiện tại coroutines cũng đã đủ để xử lý những tác vụ như vậy rồi nên chúng ta chẳng tội gì mà không dùng cả. Nếu mà chỉ nói đến đây thì lại giống các bài lý thuyết khác rồi, mình thì thích bàn đến cụ thể hơn nữa cho các bạn dễ hiểu.

Trong mô hình MVVM chúng ta đã xử lý data ở ViewModel với viewModelScope, viewModelScope là suspend fun nhưng mặc định nó chạy trên Dispatchers.Main như ví dụ ở dưới

 viewModelScope.launch { try { val result = repo.callApi() doWork(result) } catch (e: Exception) { onError(e) } }

Cách làm tốt hơn là move doWork xuống background như sau:

 viewModelScope.launch { try { val result = repo.callApi() withContext(Dispatchers.Default) { doWork(result) } } catch (e: Exception) { onError(e) } }

Lưu ý thêm một chút là nếu chúng ta muốn cập nhật liveData để notify ui từ trong background thread thì cần dùng livedata.post(value)

Vậy coroutines có gì hay cho Activity và Fragment ko? Có lifecycleScope phù hợp cho việc xử lý vớ UI

Để show một tip sau 5s, và sau đó 5s thì ẩn đi, code lại có callback hell rồi, không hay cho lắm nhỉ

val DELAY = 5000
Handler().postDelayed({ showTip() Handler().postDelayed({ hideTip() }, DELAY)
}, DELAY)

Với coroutines thì dễ hơn nhiều, lưu ý là lifecycleScope mặc định cũng trên Dispatchers.Main nên đừng tính toán logic gì trong này nhé hoặc có thì hãy withContext(Dispatchers.Default) và chuyển lại Dispatchers.Main khi cần cập nhật UI

lifecycleScope.launch { delay(5000) showTip() delay(5000) hideTip()
}

Tham khảo

Kotlin Coroutines - Use Cases on Android https://github.com/LukasLechnerDev/Kotlin-Coroutine-Use-Cases-on-Android

Android Performance Patterns: Rendering Performance 101 https://www.youtube.com/watch?v=HXQhu6qfTVU

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 213

- 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 101

- 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