2014-12-19 15 views
8

Tôi đã tìm kiếm kiến ​​trúc ứng dụng android hoàn hảo và đọc một vài bài đăng trên blog tuyệt vời về chủ đề này.Xe buýt sự kiện và vòng đời của các thành phần ui android

1) http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html

2) http://birbit.com/a-recipe-for-writing-responsive-rest-clients-on-android/

Cả hai bài viết mô tả làm thế nào để sử dụng xe buýt kiện để liên lạc giữa các thành phần android (hoạt động, mảnh vỡ, dịch vụ).

Một, nhưng chủ đề rất quan trọng không được đề cập đến. Cách xử lý các sự kiện đã được đăng lên các thành phần giao diện người dùng khi chúng bị tạm dừng.

Ví dụ: dịch vụ đang đăng sự kiện khi hoàn thành tải dữ liệu xuống hoạt động. Và tại thời điểm này, hoạt động bị tạm dừng. Vì event bus không được đăng ký trong onPause(), chúng ta sẽ mất hoàn toàn sự kiện này.

EvenBus từ greendao cung cấp các chất dính. Nhưng chúng có thể gây rò rỉ bộ nhớ nếu không bị loại bỏ.

Otto từ hình vuông giới thiệu mẫu "Nhà sản xuất", có thể được sử dụng thay cho các sự kiện dính.

Giải pháp đầu tiên có thể gây rò rỉ bộ nhớ nếu sự kiện dính không được gỡ bỏ thủ công.

Yêu cầu thứ hai để giữ dữ liệu ở đâu đó cho đến khi Phương thức nhà sản xuất trả lại dữ liệu cho Người đăng ký. Giải pháp này có vẻ chính xác hơn, nhưng yêu cầu viết nhiều mã hơn.

Có ai vui lòng chia sẻ với các ý tưởng về cách xử lý trường hợp cạnh này không? Bất kỳ giải pháp sạch nào?

+0

đây là điều tôi cũng muốn biết. bạn đã tìm thấy câu trả lời thỏa mãn chưa? – stefs

+0

Tôi đã cố gắng giải quyết vấn đề này. Tôi đã tạo một đối tượng hòa giải ứng dụng (đối với các ứng dụng lớn hơn có thể được chia thành nhiều bộ trung gian), đối tượng hòa giải có tham chiếu yếu đến hoạt động được sử dụng một cách curently, hoạt động được đặt và không được đặt trên sơ yếu lý lịch và tạm dừng.Khi một sự kiện được gửi đi, người hòa giải nhận sự kiện, nó sẽ lưu kết quả trong bộ nhớ cache dữ liệu phiên, sau đó xếp hàng một lệnh để trả lời sự kiện sẽ thực hiện ngay hoặc khi một hoạt động hợp lệ được nối lại. Tôi rất muốn nghe bất cứ ai elses cách xung quanh này. – serenskye

Trả lời

1

Tôi cũng đã sử dụng một kiến ​​trúc rất tao nhã bằng EventBus. Đây là một công cụ tuyệt vời để tách giao diện người dùng của bạn khỏi lớp kinh doanh và dấu phẩy và ngăn việc chạy mạng dài hoặc công việc db khỏi cố gắng cập nhật giao diện người dùng đã bị hủy. Tôi có thể nói về nó cả ngày, nhưng tôi sẽ tập trung vào vấn đề của bạn.

Sử dụng sự kiện dính là, trong hầu hết các trường hợp và IMHO, hoàn toàn ổn. Có kỹ thuật nó là một rò rỉ bộ nhớ vì sự kiện được lưu trữ trong bộ nhớ và không có gì ngoại trừ eventbus là tham chiếu nó ... được nêu ra. Nhưng các sự kiện dính theo định nghĩa là tất cả các rò rỉ bộ nhớ kỹ thuật, cho đến khi bạn thực sự sử dụng chúng đúng không? Vì vậy, nếu bạn bắt đầu lên mảnh của bạn và sử dụng sự kiện dính sau đó đột nhiên, nó không phải là một rò rỉ bộ nhớ nữa.

Dù sao, không quá tôn giáo, sự kiện dính là hoàn toàn tốt miễn là sự kiện không chứa một triệu bản ghi hoặc cấu trúc dữ liệu lớn như hình ảnh. Sau đó, lý thuyết rò rỉ bộ nhớ của bạn bắt đầu có ý nghĩa hơn.

Tuy nhiên, những gì bạn đang thực sự cố gắng làm là lưu vào bộ nhớ cache kết quả của cuộc gọi mạng phải không? Vì vậy ...

Tôi khuyên bạn nên triển khai một số bộ nhớ đệm http thông minh và liên tục. Robospice thực hiện rất nhiều điều này trong hộp cho bạn. Bạn có thể xác định các khóa bộ đệm, vị trí tệp bộ nhớ cache và thời gian chờ của bộ nhớ cache - những điều thực sự thú vị. Điều này loại bỏ bộ nhớ cache từ bộ nhớ (tức là sự kiện dính) và vào một tập tin, tiếp tục xuống trong lớp comms mà có lẽ là sạch hơn nhiều.

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