RxJava – Thời đại lập trình Reactive programming ứng dụng Android đã tới

1252

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.

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.

RxJava là gì?

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?

Cách tiếp cận trước khi có RxJava

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é.

  Android Jetpack là gì? Tại sao nên dùng Android Jetpack?

  Tìm hiểu về lớp HashMap trong Java: Các hoạt động và cách dùng

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.

RxJava Basic: Observable, Observer

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ụ.

Tìm việc làm Android lương cao trên TopDev!

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é.

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev