[RxJava] Concat vs Merge operator
Rx
7
RxJava
7
concat
1
merge
1
Male avatar

Hades viết ngày 06/07/2020

Introduction

Hi mọi người, hôm nay chúng ta sẽ cùng tìm hiểu một số operator đơn giản và hữu ích trong Rx là Concat và Merge nhé.

Concat()

alt text

Concat ghép nối đầu ra của các Observables rồi trả về một Observable duy nhất. Nó sẽ duy trì thứ tự của các Observable khi phát ra item. Tức là nó sẽ phát ra tất cả item của Observable thứ nhất, sau đó sẽ đến các item của Observable thứ hai và cứ như thế đến Observable cuối cùng.

Giờ mình sẽ lấy ví dụ nhé :

        Observable.concat(
            Observable.just(1, 2, 3),
            Observable.just(4, 5, 6)
        ).subscribe(object : Observer<Int> {
            override fun onSubscribe(d: Disposable) {

            }

            override fun onNext(s: Int) {
                println(s)
            }

            override fun onError(e: Throwable) {

            }

            override fun onComplete() {

            }
        })

Kết quả :

Value 1
Value 2
Value 3
Value 4
Value 5
Value 6

Merge

alt text

Merge ghép nối các item của các Observables rồi trả về một Observable duy nhất. Khác với concat, nó không duy trì trật tự trong khi phát ra các item, xen kẽ các item phát ra của các Observable khác nhau.

Hãy cùng xem ví dụ bên dưới :

Trong ví dụ này, mình sẽ tạo ra 2 observable cứ 1 giây lại phát ra 1 giá trị A,B.

        Observable.merge(
            Observable.interval(1, TimeUnit.SECONDS).map { id -> "A $id" },
            Observable.interval(1, TimeUnit.SECONDS).map { id -> "B $id" })
            .subscribe(object : Observer<String> {
                override fun onComplete() {
                }

                override fun onSubscribe(d: Disposable) {
                }

                override fun onNext(t: String) {
                    Log.e("TAG", "Value $t")
                }

                override fun onError(e: Throwable) {
                }
            })

Kết quả :

Value A 0
Value B 0
Value A 1
Value B 1
Value A 2
Value B 2
Value A 3
Value B 3
...

Các giá trị A,B sẽ lần lượt xen kẽ nhau chứ không theo thứ tự hết A rồi mới đến B.

Để thấy được sự khác nhau giữa concat và merge. Mình sẽ lấy một ví dụ :

Trong ví dụ này, mình sẽ tạo ra 2 Observable, mỗi observable cứ 1 giây lại phát ra 1 item sau đó nối lại với nhau bằng toán tử concat.

        Observable.concat(
            Observable.interval(1, TimeUnit.SECONDS).map { id -> "A $id" },
            Observable.interval(1, TimeUnit.SECONDS).map { id -> "B $id" })
            .subscribe(object : Observer<String> {
                override fun onComplete() {
                }

                override fun onSubscribe(d: Disposable) {
                }

                override fun onNext(t: String) {
                    Log.e("TAG", "Value $t")
                }

                override fun onError(e: Throwable) {
                }
            })

Kết quả :

A0
A1
A2
A3
A4
...
An

Như đã nói ở trên, chỉ khi phát hết item ở Observable A thì Observable B mới được phát. Ở đấy cứ 1s thì Observable A lại phát, vì vậy Observable B sẽ không bao giờ phát ra được.

Conclusion

Hi vọng qua bài viết này, các bạn có thể hiểu được sự khác nhau giữa 2 thằng này :D
Happy coding !!!

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Hades

14 bài viết.
18 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
9 13
Dưới đây là một cách tổ chức thư mục mà mình cho là khá hợp lý. Hi vọng mọi người có thể tham khảo và góp ý :smile: Android_structure ├─ com.abc ...
Hades viết gần 4 năm trước
9 13
Male avatar
5 2
Những điều cần nhớ Hades 22042017 Đừng dùng lại Đừng sử dụng lại strings cho nhiều màn hình khác nhau. 1. Tưởng tượng rằng bạn có một hộp thoạ...
Hades viết hơn 3 năm trước
5 2
Male avatar
4 0
Giới thiệu RecycleView là một viewGroup mới được giới thiệu trong Android L ( API 21 ). Đây là một viewGroup có chức năng tương tự như ListView nh...
Hades viết gần 4 năm trước
4 0
Bài viết liên quan
Male avatar
0 0
Introduction Hi ae, trong bài viết này, mình sẽ cùng các bạn tìm hiểu về cách xử lý lỗi trong RxJava. Đầu tiên, hãy nhớ rằng Observable thường kh...
Hades viết 5 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
14 bài viết.
18 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!