[RxJava] Xử lý luồng trong Android
Rx
7
RxJava
7
RxAndroid
2
Male avatar

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

Giới thiệu

Xử lý luồng luôn là một chủ đề khó trong lập trình. Và nó cực kì quan trọng trong Android, nhất là khi ta phải đưa tất cả luồng xử lý network, database, tính toán... xuống tác vụ nền để tránh block UI.

Vì vậy, không có cách nào để để thoát được việc phải học nó cả. Nhưng yên tâm, mọi thứ sẽ trở nên đơn giản hơn với RxJava.

Quay trở lại với Rx diagram

Trong bài viết trước, mình đã đề cập đến RxJava có thể được chia thành 3 phần đơn giản : Producer, Operators và Consumer.

alt text

Hãy tưởng tượng rằng, một số tác vụ tiêu tốn thời gian cần thực hiện tưới nền và chỉ Consumer chạy trên UI thread.

alt text

observeOn(… thread…)

Để xác định xem chuỗi operators được thực hiện trên luồng nào, ta chỉ cần đơn giản gắn thêm chuỗi observeOn ứng với thread mong muốn.
alt text

Nó sẽ tương đương như sau :

producer().observedOn(Schedulers.computational())
          .operation1()
          .operation2()
          .observedOn(Schedulers.io())
          .moreOperations()
          .observedOn(AndroidScheduler.mainThread())
          .subscribe(...)

Nhìn khá simple đúng không ? :D

Có thể bạn sẽ đặt ra 1 câu hỏi...

Thế còn xử lý phía Producer thì sao ?

Giả sử hoạt động của producer rất chậm, và ta cũng muốn đưa nó vào background thì phải làm thế nào ?

Observable.fromCallable { superSlowProcess() }.subscribe{ ... }

subscribeOn(… thread …)

Tương tự observeOn(...), sử dụng subscribeOn(...) nhưng nó khác ở điểm, bạn có thể subscribeOn(...) ở bất cứ đâu trong chuỗi ( sau Producer và trước Consumer).
alt text

Mã code sẽ trông như thế này :


Observable.fromCallable { superSlowProcess() }
          .operators // or operators...
          .subscribeOn(Schedulers.io())          
          .observeOn(AndroidScheduler.mainThread())
          .subscribe{ ... }

Hoặc bạn cũng có thể viết như bên dưới đây, cùng một kết quả, chỉ là ta có thể dễ dàng thấy nới đăng kí và quan sát gần nhau hơn ::lol::

Observable.fromCallable { superSlowProcess() }
          .operators // or operators...
          .subscribeOn(Schedulers.io())          
          .observeOn(AndroidScheduler.mainThread())
          .subscribe{ ... }

Conclution

OK. Hi vọng qua bài viết này các bạn có thể hiểu qua về cách xử lý luồng trong Rx.
Bài viết tới mình sẽ cùng tìm hiểu về HOT Observable và COLD Observable xem nó là gì và tác dụng từng loại nhé. Happy coding !!!

Reference

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
Male avatar
0 0
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() (Ảnh...
Hades viết 9 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á!