RxJava-Thời đại của Reactive programming đã tới

1

Trước mình làm JavascriptNodejs, mình va chạm rất nhiều tới tư duy hướng sự kiện. Lúc đó mình cứ nghĩ rằng có lẽ tư duy kiểu hướng sự kiện này chỉ có mỗi trên web app, hay Javascript mà thôi.

Với các ứng dụng Android, các bạn đã quá quen thuộc với cách viết code tuần tự, người ta gọi là lập trình đồng bộ. Và giờ đây cái tư duy hướng sự kiện hay bất đồng bộ đó đã lan sang cả các ứng dụng Android.

Không biết do mình cổ hủ hay giờ người ta mới phổ biến “nó”. Nó ở đây chính là RxJava, một thư viện để hỗ trợ việc viết ứng dụng Android theo tư duy hướng sự kiện.

Nếu bạn đang có ý định tìm hiểu hoặc đã tìm hiểu nhưng vẫn còn mơ hồ về RxJava thì bài viết này dành 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.

Tìm hiểu 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.

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?

Rxjava đơn giản

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.

Lập trình Bất đồng bộ với rxjava

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 gọn hơn.
  • Không cần đến Context.
  • 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é.

1
Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
SEO Company
Guest

Awesome post! Keep up the great work! 🙂