- Published on
Android Thread: Kiến Thức RxJava
- Authors
- Name
- Dan Tech
- @dan_0xff
Có nhiều cách để thao tác với Thread trong Android: Thread, ThreadPoolExecutor, HandlerThead hoặc RxJava hoặc Kotlin Coroutines. Trong chuỗi bài viết này mình sẽ mang đến đầy đủ 3 mảng kiến thức để làm rõ các khái niệm, cách sử dụng, ưu nhược điểm của 3 phương pháp này cho bạn đọc.
RxJava là gì?
Khái niệm
RxJava là thư viện viết bởi ngôn ngữ Java, với mục đích đơn giản hóa việc tiếp nhận và xử lý logic bất đồng bộ nhiều Thread trong chương trình. RxJava nhìn nhận logic chúng xử lý là 1 data stream (luồng dữ liệu). Trên các data stream này RxJava cung cấp các hỗ trợ đắc lực để thao tác, gọi là các operator.
Bạn có thể gọi các Data Stream có thể được gọi là các Observable Object (đối tượng mà có thể được theo dõi sự thay đổi dữ liệu)
Các loại Observable Object trong RxJava
Trong lập trình có 2 khái niệm Hot Stream, Cold Stream dùng để chỉ các kiểu luồng dữ liệu với các đặc tính riêng.
Việc quy hoạch các loại Observable Object trong RxJava cũng sẽ được mình phân loại trên 1 trong 2 loại này. Các tiêu chuẩn phân loại dựa trên sự khác biệt của thời điểm mà object đó emit item, và cách chúng quản lý các Observer Object.
Các loại Operator trong RxJava
RxJava hỗ trợ nhiều operator cho việc thao tác, xử lý. Việc học thuộc hết cách sử dụng RxJava operator là vô nghĩa. Hãy tiếp thu, tham khảo và vận dụng chúng phù hợp theo từng bài toán cụ thể của bạn!
Backpressure trong RxJava?
Cái này để dành viết riêng 1 bài nha. Kiến thức của nó dài, ảo diệu và khó hình dung.
RxAndroid là gì?
RxAndroid là một extension của RxJava dành riêng cho Android Platform. Nó cung cấp các tích hợp để RxJava hoạt động tốt, ổn định trên hệ điều hành Android.
Câu hỏi: Vì sao cần RxAndroid? Nếu không có RxAndroid thì có dùng được RxJava trong Android không?
Trả lời: Cần RxAndroid để RxJava có thể hoạt động được với các Android Component. Nếu không có RxAndroid, RxJava vẫn có thể hoạt động được. Nhưng không thể tích hợp được với Android Component (Fragment, Activity, UI Thread ...)
usersObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) // RxAndroid extension
.subscribe(users -> {
// Update the UI with the list of users
});
Một số điểm mạnh của RxJava so với cách lập trình cũ
RxJava dễ sử dụng, dễ hiểu với người có nền tảng tốt về Threading, lập trình Multi Threads.
- RxJava sử dụng ThreadPool và được quy hoạch trong các Schedulers, giúp cho code trở nên sạch và tường minh hơn. Schedulers.io, Schedulers.computation. Điều này cũng giúp cho phần mềm viết ra tận dụng được tốt tài nguyên trong chương trình.
- RxJava quản lý việc subscribe lên các Observable Object bằng các Disposable Object. Điều này đồng nghĩa lập trình viên có thể chủ động quản lý lifecycle của các data stream. Chủ động tránh memory leaks.
- RxJava cung cấp giải pháp quản lý Error thông qua callback onError cho subscriber. Chương trình viết với RxJava sẽ an toàn hơn với các lỗi crash trong quá trình xử lý ở upstream.
- RxJava cung cấp giải pháp switch thread một cách dễ hiểu, dễ sử dụng thông qua 2 phương thức subscribeOn, observeOn
Một số drawback của RxJava
Gọi là drawback của RxJava mà không phải disadvantages vì đây sẽ luôn là vấn đề của multi threading. Cái mình muốn truyền đạt ở đây là chỉ ra vấn đề còn tồn đọng để tránh khi làm việc. Thật ra không thể có giải pháp hoàn hảo dù chúng ta dùng công cụ nào cho multi threading programming.
- RxJava sử dụng ThreadPool, nhưng nếu tất cả các Thread trong ThreadPool đều đang được tận dụng thì RxJava sẽ tạo thêm Thread. Điều này vô tình vẫn gây ra overhead cho ứng dụng. Xin nhấn mạnh rằng đây không phải là nhược điểm, đây là sự thật hiện hữu trong lập trình. Mình chỉ ra để chúng ta hiểu RxJava không phải là thuốc giải cho mọi vấn đề trong multi thread Java / Android.
- Callback hells - đương nhiên rồi vì multi thread là callback hells. It's what it's
- Khi nào nghĩ ra mình sẽ viết vào đây tiếp!