12/08/2018, 14:09

Cùng học RxJava, phần 3: Core Operators

Xin chào các bạn. Ở 2 bài trước chúng ta đã học những khái niệm và concept cơ bản nhất của RxJava, tuy nhiên có thể nhiều bạn sẽ nghĩ rằng nếu RxJava chỉ có thế thì việc thêm nó vào dependencies có vẻ hơi bị "overkill". Ở bài này tôi sẽ bắt đầu chứng minh cho bạn thấy rằng RxJava không chỉ là 1 ...

Xin chào các bạn. Ở 2 bài trước chúng ta đã học những khái niệm và concept cơ bản nhất của RxJava, tuy nhiên có thể nhiều bạn sẽ nghĩ rằng nếu RxJava chỉ có thế thì việc thêm nó vào dependencies có vẻ hơi bị "overkill". Ở bài này tôi sẽ bắt đầu chứng minh cho bạn thấy rằng RxJava không chỉ là 1 phiên bản tốt hơn của AsyncTask hay ListenableFuture, sức mạnh thật sự của nó nằm ở 1 tập hợp khổng lồ các toán tử (operators) có thể sẽ thay đổi cách mà bạn đã code từ trước đến giờ.

Operator là gì?

Có thể nhiều bạn không để ý nhưng chúng ta đã học được 1 số Operator từ phần 1 của series, đó là các Operator dùng để tạo ra Observable. Ngoài ra thì chúng ta còn có rất nhiều Operator khác và được ReactiveX cho vào các category như Transformation, Combination, Filtering, Side-effect,... nhằm phục vụ cho các use case khác nhau.

getANumberObservable()
               .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        Log.i("Operator thread", Thread.currentThread().getName());
                        return String.valueOf(integer);
                    }
                })

                .subscribe(new Action1<String>() {
                    @Override
                        public void call(String s) {
                        Log.i("Subscriber thread", Thread.currentThread().getName());
                    }
                });

Trong đoạn code trên thì hàm map chính là 1 Operator. Hầu hết các operator đều hoạt động trên 1 Observable và sẽ trả về 1 Observable khác nên nó rất phù hợp để bạn nối (chain) các Operator với nhau để ra được Observable mong muốn trước khi gửi nó cho Subscriber. Cần lưu ý rằng đây là 1 serial execution; Ví dụ nếu bạn nối 3 operator map với nhau thì nó sẽ đc execute theo trình tự - map thứ 2 sẽ chỉ chạy khi map thứ nhất chạy xong, tương tự với map 3.

Vậy Operator để làm gì?

Câu trả lời là: Operator có thể làm được mọi thứ - tất nhiên là nếu bạn biết cách sử dụng chúng. Vì số lượng Operator là quá lớn nên sẽ là nhiệm vụ bất khả thi để liệt kê ra cách sử dụng của tất cả, do vậy trong bài này tôi sẽ chỉ tập trung giới thiệu 1 số Operator mà tôi coi nó là "core" - phù hợp với những use case phổ biến.

Chúng ta sẽ bắt đầu với việc setup để sử dụng Retrolambda. Do Android chưa support hoàn toàn lambda expression của Java 8 (bạn có thể sử dụng lambda bằng Jack nhưng hiện giờ Jack chưa production-ready) nên Retrolambda là lib không thể thiếu nếu bạn muốn dùng RxJava. OK, tôi đùa thôi, thật ra bạn không bắt buộc phải dùng Retrolambda nhưng như thế sẽ làm RxJava trông rất dài dòng vì nó có khá nhiều boilerplate code. Bạn chưa biết lambda expression là gì? Hãy xem trên wiki, Bạn không biết sử dụng lambda? Đừng lo, lúc đầu bạn cứ code như bình thường, Android Studio sẽ hỗ trợ bạn convert code sang lambda nên dùng nhiều sẽ quen. Ở bài này tôi cũng sẽ chỉ dùng lambda nên cố gắng xem nhé             </div>
            
            <div class=

0