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

Trước mình làm Javascript và Nodejs, 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ẽ rằng 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 những ứng dụng Android, những 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 nhất. Và giờ đây cái tư duy hướng sự kiện hay bất đồng bộ đó đã lan sang cả những ứng dụng Android .
Không biết do mình cổ hủ hay giờ người ta mới phổ cập “ nó ”. Nó ở đây chính là RxJava, một thư viện để tương hỗ 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 những ứ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 những 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 đơn cử đó ( update View, giải quyết và xử lý tác dụng trả về. v.v … )
RxJava có phiên bản đặc biệt quan trọng cho Android gọi là RxAndroid. Về cơ bản triết lý là giống nhau, chỉ khác RxAndroid có lan rộng ra và tương hỗ thêm những API của Android mà thôi .
Để những bạn dễ hiểu hơn, mình sẽ quay lại lịch sử vẻ vang 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 thao tác trong những dự án Bất Động Sản Android thì hẳn không còn lạ lẫm gì tới AsyncTask. Nhiệm vụ của nó là thực thi những tác vụ nặng dưới background, sau khi triển khai xong thì cập nhập lên UI Thread .
Nhưng ở đây có một số ít yếu tố :

  • 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 yếu tố tiềm tàng khác nữa, bạn hoàn toàn có thể đọc bài viết này : Đừng dùng AsyncTask cho tác vụ Network
Giờ đây, bạn hoàn toàn có thể nghĩ tới RxJava, nó sẽ xử lý những yếu tố 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à ngăn nắp và sạch sẽ và đẹp mắt 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 thực 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 ít về những API của RxJava nhé .

RxJava Basic : Observable, Observer

RxJava gồm hai component chính là : Observable và Observer. Và để link hai component này thì có một số ít 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 những sự kiện. Bạn sẽ lắng nghe những sự kiện này để có hành vi thích hợp. Giờ đây sẽ không còn khái niệm đợi chờ một tác vụ triển khai xong rồi lần lượt tới những tác vụ khác .

Observer

Là những đoạn code sẽ lắng nghe Observable. Nó nhận tài liệu từ Observable phát ra. Bạn sẽ cần phải override lại những methods để Observer thao tác .
Ví dụ những methods phổ cập :

  • 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 thuần như vậy thôi, giờ mình sẽ cùng nhau thực hành thực tế ứng dụng RxJava vào dự án Bất Động Sả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 gian mình viết bài .
Dưới đây là ví dụ về in một list và update 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() {
            @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 hoàn toà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ề những quy mô như MVVM, MVP thì RxJava gần như là thư viện được đóng đinh để tương hỗ bạn tiến hành quy mô hiệu suất cao .
Cảm nhận của bạn về RxJava như thế nào ? Để lại phản hồi bên dưới nhé .