2013-09-25 61 views
10

Tôi đang tìm một câu trả lời kỹ thuật về cách thư viện robospice android quản lý vòng đời hoạt động. Từ nhận trang bắt đầu:.Làm thế nào để robospice quản lý vòng đời hoạt động?

https://github.com/octo-online/robospice/wiki/Starter-Guide

"Là một lớp bên trong của hoạt động của bạn (hoặc bối cảnh khác), thêm một RequestlListener rằng sẽ cập nhật giao diện người dùng của bạn Đừng lo lắng về rò rỉ bộ nhớ, RoboSpice quản lý hoạt động của bạn vòng đời."

Câu hỏi của tôi là cách robospice tự động cập nhật trình nghe yêu cầu để nó vẫn có thể gọi đúng người nghe với ngữ cảnh chính xác sau khi quay và sau khi hoạt động đã bị hủy và tái tạo dưới dạng một phiên bản mới?

Tôi đã cố gắng để thiết kế đối chiếu mã nguồn nhưng đã không tìm thấy một câu trả lời nào:

https://github.com/octo-online/robospice

Trả lời

9

@Take Chances Make Cha. Những gì bạn đang nói là hoàn toàn đúng. RS đã được thiết kế với sự suy nghĩ rõ ràng này: quản lý các yêu cầu mạng và các vòng đời của các hoạt động.

@ craigrs84. Về cơ bản, điều xảy ra với RS là khi yêu cầu được xử lý, người nghe của nó sẽ được gọi miễn là hoạt động liên quan còn sống. Nếu hoạt động không còn hoạt động nữa, tất cả người nghe của nó sẽ được rút khỏi RS và họ sẽ không được thông báo. Mục đích chính của RS là để đảm bảo rằng không có rò rỉ bộ nhớ: hoạt động của bạn, nếu nó phải chết, sẽ chết và được thu gom rác, RS không giữ bất kỳ tham chiếu cứng nào để ngăn chặn rác bộ sưu tập. Đó thực sự là ý tưởng cốt lõi đằng sau RoboSpice.

Nếu bạn muốn một phiên bản mới của hoạt động của bạn được bổ sung vào yêu cầu đang chờ xử lý (ví dụ bạn thực hiện yêu cầu, sau đó xoay thiết bị và sau đó nhận phiên bản mới của hoạt động của bạn và muốn trường hợp mới đó nhận được kết quả của yêu cầu được thực hiện bởi cá thể trước đó), có thể với RS.

Trong trường hợp này, hãy sử dụng phương thức spiceManager.addListenerIfPending khi khởi động, ngay sau khi gọi tới spiceManager.start (..). Điều này sẽ không thực hiện một yêu cầu mới, nhưng lại cắm một người nghe mới vào một yêu cầu đang chờ xử lý. Nếu không có yêu cầu nào đang chờ xử lý thì nó sẽ không làm gì cả.

+0

Vì vậy, nếu bạn không cung cấp requestCacheKey và có nhiều phiên bản của cùng một Hoạt động đang chạy cùng một lúc, thì addListenerIfPending vẫn hoạt động chính xác? Hoặc là không có đủ thông tin trong trường hợp đó? Đây có lẽ là một kịch bản không chắc nhưng tôi tò mò. – craigrs84

+0

@snicolas, tôi tò mò, nếu bạn không gọi shouldStop() (hoặc phương pháp không đồng bộ) không phải thư viện gọi lại cho những người nghe đã đăng ký Hoạt động, Phân đoạn, Dịch vụ, v.v ...? Nếu không đào quá nhiều thông qua nguồn và dựa trên việc sử dụng và kiểm tra thư viện của bạn sớm, tôi sẽ nhận được một ngoại lệ khi tôi nhận được một cuộc gọi lại đến một Object đã "chết". Ngoài ra, thư viện là tuyệt vời, xin vui lòng theo kịp công việc tốt! – AllDayAmazing

+0

Nếu bạn không gọi shouldStop, thì người nghe sẽ được kích hoạt. Điều này có thể gây ra sự cố và rò rỉ bộ nhớ vì người nghe thường xuyên là các lớp bên trong và giữ một tham chiếu trên một cá thể hoạt động đã bị phá hủy và thậm chí nó có thể sụp đổ nếu bạn làm những việc như findViewById trong trình lắng nghe của bạn. Tôi nghĩ rằng bạn đã có nó, chỉ muốn làm cho mọi thứ rõ ràng. – Snicolas

2

Câu trả lời ngắn gọn, từ kinh nghiệm của tôi, là nó không. Ví dụ, nếu bạn không gọi SpiceManager.shouldStop() và thực hiện một yêu cầu, tham chiếu đến RequestListener vẫn được giữ lại và bạn có thể bị rò rỉ bộ nhớ vì nó cố cập nhật mọi thứ được tham chiếu bên trong nó nếu Hoạt động của bạn/Phân đoạn/Dịch vụ không còn tồn tại nữa.

+0

Xin lỗi, nhưng không, không có rò rỉ bộ nhớ trong RS với người nghe. Chúng được loại bỏ và thu gom rác ngay trong shouldStop. – Snicolas