9

Tôi biết đây là câu hỏi được hỏi nhiều lần. Tuy nhiên có một cái gì đó tôi không bao giờ tìm thấy một câu trả lời cho. Vì vậy, hy vọng ai đó có thể cho tôi một số ánh sáng.Android AsyncTask vs Chủ đề + Handler vs rxjava

Chúng ta đều biết rằng AsyncTask và Thread là các tùy chọn để thực hiện các tác vụ nền để tránh vấn đề ANR. Chúng tôi khuyên bạn chỉ nên sử dụng asynctask cho các tác vụ chạy ngắn trong khi chuỗi có thể được sử dụng cho các tác vụ dài hạn. Những lý do tại sao asynctask không nên được sử dụng cho các tác vụ dài là nổi tiếng mà là về sự rò rỉ có thể gây ra bởi asynctask vì nó có thể tiếp tục chạy sau khi một hoạt động bị phá hủy. Đó là thuyết phục. Tuy nhiên, nó cũng dẫn đến một số câu hỏi khác:

  1. Chủ đề không còn độc lập với vòng đời hoạt động? Do đó, rủi ro với asynctask cũng có thể được áp dụng cho luồng. Vậy tại sao luồng chỉ phù hợp cho các tác vụ dài hạn?
  2. Dường như nguy cơ asynctask chỉ áp dụng khi sử dụng nó với hoạt động. Nếu chúng ta sử dụng nó trong dịch vụ (không phải IntentService vì IntentService dừng sau khi công việc của nó hoàn thành), và miễn là chúng ta có thể đảm bảo hủy bỏ asyntask khi dịch vụ dừng lại, chúng ta có thể sử dụng nó cho các tác vụ dài hạn không? và nó không có nghĩa là nó có nguy cơ miễn phí để sử dụng asynctask trong các dịch vụ?
  3. Tôi đã chơi với rxjava một lúc và thực sự thích nó. Nó giúp loại bỏ sự cần thiết phải lo lắng về luồng (trừ khi bạn phải quyết định trong đó thread để đăng ký và quan sát dữ liệu phát ra). Từ những gì tôi có thể thấy, rxjava (kết hợp với một số libs khác như retrofits) có vẻ là một sự thay thế hoàn hảo của asynctask và thread. Tôi tự hỏi nếu chúng ta hoàn toàn có thể quên chúng hoặc có bất kỳ trường hợp cụ thể mà rxjava không thể đạt được những gì asynctask và thread có thể làm điều đó tôi cần phải nhận thức?

Cảm ơn

Trả lời

1

Vì không ai trả lời. Tôi trả lời câu hỏi của chính tôi rồi.

  1. Lý do tại sao AsyncTask chỉ được khuyến nghị cho các tác vụ ngắn (khoảng 5 giây) là không có phương pháp hủy chạy AsyncTask. Có một phương pháp được gọi là AsyncTask.cancel(true), gọi số onCancelled(Result result). Tuy nhiên, theo các tài liệu, phương pháp này "chạy trên thread UI sau khi hủy bỏ (boolean) được gọi và doInBackground (Object []) đã hoàn thành." (https://developer.android.com/reference/android/os/AsyncTask.html). Mặt khác, Thread có thể dừng lại với Thread.interrupt().
  2. Không có sự cố nào khi chạy AsyncTask trong một Service với điều kiện bạn biết giới hạn hủy của AsyncTask và khả năng rò rỉ bộ nhớ có thể được tạo bởi AsyncTask.Lưu ý rằng, rõ ràng là không cần phải sử dụng một AsyncTask trong một IntentService mà đã chạy trong một chuỗi công nhân.
  3. Đây là một câu hỏi rất dựa trên kinh nghiệm. Tôi đoán sẽ không có câu trả lời hoàn chỉnh. Những gì chúng ta có thể làm là hiểu Rx và nhận thức được những hạn chế của nó để xác định nơi thích hợp để sử dụng nó. Trong công việc phát triển của tôi, tôi sử dụng RxJava tất cả thời gian mà không gặp bất kỳ vấn đề nào. Lưu ý rằng cùng một vấn đề rò rỉ bộ nhớ cũng được áp dụng cho RxJava. Bạn có thể tìm thấy một trong những câu hỏi cụ thể here. Ngoài ra còn có một loạt các cuộc thảo luận về xử lý rò rỉ/xoay màn hình với RxJava có thể dễ dàng được tìm thấy bởi Googling.
0

AsyncTask và Chủ đề + Handler không được thiết kế một cách cẩn thận và thực hiện. RxJava, Akka và các khung công tác khác cho việc thực hiện không đồng bộ dường như được phát triển một cách cẩn thận hơn.

Mỗi công nghệ đều có những hạn chế của nó. AsyncTask dành cho một tác vụ song song với khả năng hiển thị tiến trình trên giao diện người dùng. Tuy nhiên, nếu hoạt động được tái tạo (ví dụ: do xoay màn hình), kết nối với giao diện người dùng bị mất (một giải pháp khả thi cho vấn đề này là https://github.com/rfqu/AsyncConnector).

Thread+Handler giữ bộ nhớ cho ngăn xếp chuỗi ngay cả khi không có thông báo nào để xử lý. Điều này giới hạn số lượng chủ đề có thể. Bạn có thể có nhiều hơn Akka actors hoặc RxJava Subscribers so với chuỗi xử lý, với chức năng tương tự.

+0

Cảm ơn câu trả lời. Vì vậy, nó có nghĩa là sử dụng rxjava thay vì Asynctask và Thread luôn luôn? Bạn có thể vui lòng làm rõ những gì bạn có nghĩa là "cẩn thận" trong câu trả lời? Cảm ơn –

Các vấn đề liên quan