Coroutines và RxJava - Phần 1: Xử lý bất đồng bộ
Giới thiệuTrong loạt bài viết này, tôi sẽ so sánh Kotlin Coroutine và RxJava, bởi vì chúng đều giải quyết vấn đề chung trong phát triển Android: Xử lý bất đồng bộ. Show Use case 1: Khởi tạo đối tượng heavy khi khởi chạy ứng dụngHiệu năng của Launch-Time là rất quan trọng. Nếu bạn muốn ứng dụng của mình khởi chạy thật nhanh, điều quan trọng là cách bạn xử lý việc khởi tạo Object. Có một số tính toán có thể mất một chút thời gian (ví dụ: khởi tạo các đối tượng heavy). Bạn không muốn điều đó thực hiện trong UI thread! Nếu không, ứng dụng của bạn sẽ bỏ qua khung hình và người dùng sẽ có trải nghiệm bị lag. Điều gì có thể ảnh hưởng đến trải nghiệm này? Khởi tạo SDK, tạo đối tượng crypto,... Đối với trường hợp sử dụng đầu tiên này, chúng ta chỉ muốn thực hiện một hoạt động heavy trong background thread. RxJavaMặc dù RxJava là một thư viện Reactive Extensions cho JVM, bạn cũng có thể sử dụng nó để chạy các tác vụ không đồng bộ trong background thread. Trong trường hợp này, chúng ta bỏ qua khả năng RxJava trong việc truyền các stream phần tử, mà chỉ muốn xử lý bất đồng bộ trong khởi tạo. Với RxJava, một Completable sẽ giúp chúng ta thực hiện điều này. Một Completable đại diện cho một tính toán trì hoãn mà không có bất kỳ giá trị nào mà chỉ trả về dấu hiệu cho việc hoàn thành hay xảy ra ngoại lệ. Cách dùng một Completable để khởi tạo các đối tượng mà chúng ta muốn:
Như bạn có thể thấy, chúng ta đã tạo một function sẽ trả về một đối tượng Completable. Bên trong function, chúng ta đang tạo Completable tùy chỉnh với Sau khi thực hiện quá trình khởi tạo heavy, chúng ta sẽ thông báo cho emitter rằng nó đã thành công. Nếu có lỗi, chúng ta sẽ thông báo về lỗi đã xảy ra. Điều này là do emitter thuộc loại CompletableEmitter với Một cách khác bạn có thể thực hiện là với
Cách chúng ta có thể sử dụng Function trên:Như chúng ta đã biết, Chúng ta phải subscribe với
Làm cách nào để nói với RxJava rằng chúng ta muốn quá trình khởi tạo được thực thi trên background thread? Chúng ta sử dụng toán tử Muốn thực hiện một số thay đổi về giao diện người dùng khi quá trình khởi tạo hoàn tất, chúng ta sẽ sử dụng toán tử Chỉ khi bạn subscribe với Sau khi xác định thread, chúng ta muốn Nếu chúng ta muốn code này được thực thi khi tạo
Cách chúng ta có thể làm điều tương tự với Coroutines? Kotlin CoroutinesVới Coroutines, điều này thậm chí còn đơn giản hơn! Về mặt khái niệm, coroutine tương tự như một thread theo nhiều cách khác nhau: chúng ta có thể viết mã tuần tự có thể chạy trên một thread cụ thể. Tôi sẽ viết một bài đăng khác về phân luồng thread trong cả RxJava và Coroutines. Hiện tại, bạn cần biết rằng chúng ta có thể xác định chính sách phân luồng của một coroutine bên trong CoroutineBuilder là một function tạo một Coroutine, chạy một khối code và cho phép bạn truy cập vào kết quả của nó ở một số dạng. Ví dụ về CoroutineBuilder là: launch, async, runBlocking Giả sử chúng ta muốn gọi phương thức
Hãy bắt chước ví dụ mà chúng ta đã xây dựng với RxJava: chúng ta muốn biết khi nào nó hoàn thành khởi tạo các đối tượng heavy và xử lý lỗi nếu xảy ra.
Vì code bên trong một Coroutine (gọi là suspending lambda) được thực thi tuần tự, dòng code sau Như trước đây, chúng ta có thể wrap lời gọi hàm bên trong một khối try catch để xử lý lỗi. Nó sẽ hoạt động theo cách tương tự. Làm cách nào chúng ta có thể chuyển sang UI thread và thực hiện các thay đổi UI? Có một hàm mà bạn có thể gọi bên trong một Coroutine có tên UI CoroutineContext mà chúng ta thấy trong ví dụ không phải là một phần của thư viện Kotlin Coroutines tiêu chuẩn. Vì nó dành riêng cho Android nên nó có sẵn trong thư viện sau: Use Case 2: Xử lý background với bài toán FibonacciĐối với Use Case thứ hai này, ngoài việc thực thi một cái gì đó trong background, chúng ta cũng muốn trả về một giá trị. Bây giờ, chúng ta muốn tính Fibonacci của một số khi người dùng nhập vào và click button bắt đầu tính. Bây giờ chúng ta có đoạn code sau để tính Fibonacci của một số:
Làm thế nào chúng ta có thể tính toán giá trị này trong background và trả về kết quả? RxJavaChúng ta đã thấy hầu hết các khái niệm này trong use case đầu tiên. Chúng ta cần một toán tử building của RxJava có thể trả về một đối tượng. Chúng ta có thể sử dụng Single cho nó!
Code bên trong Bạn cũng có thể sử dụng function
Chúng ta truyền tham số là giá trị số cho function đó, giá trị này cũng sẽ được sử dụng bên trong khối code Single.create. Ví dụ, chúng ta có thể lấy số đó từ một EditText.
Mỗi khi user click vào nút, chúng ta sẽ tính toán một số Fibonacci mới. Nếu người dùng thay đổi giá trị bên trong Kotlin CoroutinesVí dụ này dễ dàng như ví dụ trên. Khi người dùng nhấn vào nút, chúng ta muốn start một Coroutine và tính Fibonacci của số đã nhập. Chúng ta đã biết mọi thứ cần thiết để làm điều đó:
Phần tiếp theo?Phần thứ hai của loạt bài này chúng ta sẽ tìm hiểu về Cancelling Execution! Làm thế nào để bạn hủy một Observable? Và một Coroutine? Ref: https://medium.com/capital-one-tech/coroutines-and-rxjava-an-asynchronicity-comparison-part-1-asynchronous-programming-e726a925342a |