Trước mình làm dự án Javascript và Nodejs, mình phải làm việc rất nhiều với tư duy hướng sự kiện. Lúc đó mình cứ nghĩ rằng có lẽ kiểu lập trình hướng sự kiện này chỉ thích hợp trên web app, hay cụ thể là Javascript mà thôi.
Với các ứng dụng Android, chúng ta đã quá quen thuộc với cách viết code tuần tự, hay còn gọi là lập trình đồng bộ. Giờ đây, với tư duy lập trình hướng sự kiện hay bất đồng bộ đó đã lan sang cả các dự án xây dựng ứng dụng Android.
Không biết do mình cổ hủ, lạc hậu hay giờ người ta mới phổ biến thư viện này. Thư viện đó chính là RxJava, một thư viện để hỗ trợ việc viết ứng dụng Android theo kiểu hướng sự kiện.
Nếu bạn đang có ý định tìm hiểu hoặc đã tìm hiểu trước đó rồi. Nhưng vẫn còn mơ hồ về RxJava thì bài viết này dành riêng cho bạn. Mình sẽ giải thích theo cách đơn giản nhất có thể để các bạn có thể hiểu rõ RxJava.
Nội dung chính của bài viết
RxJava là gì?
RxJava là một thư viện dùng để viết các ứng dụng Java theo triết lý hướng sự kiện hay bất đồng bộ. Hay nói cách khác RxJava sẽ giúp cho bạn viết mã Java giống như Javascript. Về cơ bản là nó sẽ follow theo Observer Pattern.
Code của bạn sẽ chia là 2 phần: một bên là tạo các sự kiện như click vào một button, tạo một request REST API… Phần còn lại sẽ lắng nghe và phản hồi một cách bất đồng bộ với sự kiện cụ thể đó (cập nhật View, xử lý kết quả trả về.v.v…)
RxJava có phiên bản đặc biệt cho Android gọi là RxAndroid. Về cơ bản triết lý là giống nhau, chỉ khác RxAndroid có mở rộng và hỗ trợ thêm các API của Android mà thôi.
Để các bạn dễ hiểu hơn, mình sẽ quay lại lịch sử viết mã nguồn ứng dụng Android.
Cách tiếp cận trước khi có RxJava
Nếu bạn đang làm việc trong các dự án Android thì hẳn không còn xa lạ gì tới AsyncTask. Nhiệm vụ của nó là thực hiện các tác vụ nặng dưới background, sau khi hoàn thành thì cập nhập lên UI Thread.
Nhưng ở đây có một số vấn đề:
- Nếu cần xử lý đa luồng, quản lý nhiều AsyncTask thì thật là cơn ác mộng.
- Không có cơ chế xử lý lỗi.
- Dễ bị memory Leak nếu bạn tạo inner class và truyền Context không đúng cách.
Và còn nhiều vấn đề tiềm tàng khác nữa, bạn có thể đọc bài viết này: Đừng dùng AsyncTask cho tác vụ Network
Giờ đây, bạn có thể nghĩ tới RxJava, nó sẽ giải quyết các vấn đề trên cho bạn.
Dưới đây là một cách sử dụng RxJava cho một tác vụ chạy dưới background:
Observable{ //The work you need to do } //thread you need the work to perform on .subscribeOn(Schedulers.io) //thread you need to handle the result on .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(Observer{ //handle the result here })
Nhìn thật là gọn gàng và sạch đẹp phải không?
Như mình đã nói ở trên, RxJava tuân theo triết lý hướng sự kiện, nên tất nhiên là có thiết kế mã nguồn theo pattern là Observer Pattern.
Để hiểu bản chất RxJava, bạn cần hiểu về Observer Pattern.
Chúng ta sẽ đào sâu hơn một chút về các API của RxJava nhé.
RxJava Basic: Observable, Observer
RxJava gồm hai component chính là: Observable và Observer. Và để liên kết hai component này thì có một số công cụ như: Schedulers, Operators và Subscription.
Observable
Là phần sẽ tạo ra các sự kiện. Bạn sẽ lắng nghe các sự kiện này để có hành động thích hợp. Giờ đây sẽ không còn khái niệm đợi chờ một tác vụ thực hiện xong rồi lần lượt tới các tác vụ khác.
Observer
Là những đoạn code sẽ lắng nghe Observable. Nó nhận dữ liệu từ Observable phát ra. Bạn sẽ cần phải override lại những methods để Observer làm việc.
Ví dụ các methods phổ biến:
- onSubscribe(): Method được gọi khi một Observer đăng ký lắng nghe một Observable.
- onNext(): Method này được gọi khi Observable bắt đầu bắn dữ liệu.
- onError(): Nếu có bất kỳ lỗi lầm gì thì hàm onError() sẽ được gọi tên.
- onComplete(): Được gọi khi một Observable hoàn thành tất cả các tác vụ.
Thực hành sử dụng RxJava trong Android.
Lý thuyết thì cũng đơn giản như vậy thôi, giờ mình sẽ cùng nhau thực hành ứng dụng RxJava vào dự án Android.
Đầu tiên, bạn cần thêm dependencies trong build.gradle
implementation "io.reactivex.rxjava2:rxjava:2.1.6" implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
Version 2.1.6 là version mới nhất tại thời điểm mình viết bài.
Dưới đây là ví dụ về in một danh sách và cập nhật vào một Adapter của một RecyclerView.
ArrayList animals = new ArrayList(); animals.add("Tiger"); animals.add("Lion"); animals.add("Elephant");Observable.just(animals) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new Observer<ArrayList>() { @Override public void onSubscribe(Disposable d) { }@Override public void onNext(ArrayList arrayList) { //handling the result adapter.updateList(animals); adapter.notifyDataSetChanged(); }@Override public void onError(Throwable e) { //error handling made simple }@Override public void onComplete() { //cleaning up tasks } });
Qua đoạn code trên, bạn có thể thấy cách RxJava làm tốt hơn so với AsyncTask rất nhiều.
- Viết code ngắn gọn hơn.
- Không cần đến Context, điều mà chúng ta luôn muốn loại bỏ để code dễ unit hơn.
- Có hẳn phương thức để xử lý lỗi (onError)
Tổng kết
Mình hi vọng qua bài viết, bạn sẽ biết thêm một công cụ cực kỳ hữu ích, giúp bạn phát triển ứng dụng Android tốt hơn.
Sau này khi bạn đọc nhiều về các mô hình như MVVM, MVP thì RxJava gần như là thư viện được đóng đinh để hỗ trợ bạn triển khai mô hình hiệu quả.
Cảm nhận của bạn về RxJava như thế nào? Để lại bình luận bên dưới nhé.
🥰 Đọc thêm về lập trình Android:
lỗi thời r giờ chẳng dùng mấy
hay quá
Hay, giải thích và so sánh chi tiết. Hi vọng ad có 1 bài tiếp theo ở mức độ Nâng cao hơn.
Awesome post! Keep up the great work! 🙂