2012-08-07 32 views
5

Làm cách nào để giữ lại dữ liệu tốt nhất trong Phân đoạn khi hoạt động của nó trải qua chu kỳ onCreate/Destroy như từ Xoay vòng? Trong thiết lập của chúng tôi, chúng tôi có các danh sách tiềm năng được tải từ máy chủ của chúng tôi vào bộ điều hợp danh sách tùy chỉnh phân đoạn và chúng tôi muốn làm mịn UX bằng cách không làm cho chúng tải lại khi xoay vòng. Vấn đề chúng tôi đã có với thiết lập fragments retainInstance = true; là bộ điều hợp của chúng tôi có tham chiếu đến ngữ cảnh của hoạt động ban đầu và do đó sẽ làm rò rỉ bộ nhớ. Chúng ta có thể lưu trữ dữ liệu trong đoạn và tái tạo bộ điều hợp; amd nếu như vậy là thực sự thích hợp thực sự?Các mảnh vỡ Android Giữ lại dữ liệu

Ý tưởng tiếp theo là lưu trữ dữ liệu vào đối tượng đơn lẻ phiên và truy xuất sau khi xoay vòng trình bày một số vấn đề với dữ liệu cũ nhưng chúng tôi có thể dễ dàng khắc phục.

Cách thay thế khác tôi thấy, có vẻ như đó là giải pháp tốt nhất *, là lưu dữ liệu vào một gói và khôi phục vào đoạn mới sau khi xoay; Tuy nhiên, chúng tôi có khá một vài đối tượng cần được lưu trữ trong suốt ứng dụng và một số đối tượng của chúng tôi phức tạp, chứa danh sách, nhiều loại và sẽ là một nỗi đau để thực hiện gói. Có một giải pháp tốt hơn hay chúng ta phải cắn viên đạn và làm cho chúng dễ dàng?

+0

Bạn chuyển ngữ cảnh ứng dụng đến bộ điều hợp thay vì hoạt động như thế nào? Nếu bạn không làm những việc phức tạp với các ngữ cảnh theo chủ đề khác nhau, tôi khuyên bạn nên sử dụng ngữ cảnh ứng dụng, vì điều đó sẽ không thay đổi trong suốt thời gian tồn tại của ứng dụng của bạn. –

Trả lời

4

Chỉ ngăn Hoạt động tự tái tạo khi xoay vòng (v.v). Thêm

android:configChanges="keyboardHidden|orientation|screenSize" 

vào định nghĩa Hoạt động trong tệp AndroidManifest.xml của bạn. Sau đó, không cần phải tiết kiệm bất cứ điều gì về luân chuyển.

EDIT:

Nếu bạn không thích điều đó giải pháp sau đó bạn đã không có lựa chọn nào khác để sử dụng cơ chế onSaveInstanceState. Nếu bạn có dữ liệu phức tạp, chỉ cần tạo các lớp của bạn có thể Serializable và thêm chúng vào Bundle theo cách đó.

+3

Vì điều này không được khuyến khích trong tài liệu Android và ở những nơi khác, chúng tôi không xem đây là một lựa chọn khả thi. http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance() –

+2

Sau đó, bạn không có lựa chọn nào ngoài việc sử dụng cơ chế onSaveInstanceState. Nếu bạn có dữ liệu phức tạp, chỉ cần tạo các lớp của bạn có thể Serializable và thêm chúng vào Bundle theo cách đó. –

+1

Nếu bạn đưa câu trả lời vào câu trả lời, câu trả lời sẽ được chấp nhận là chính xác. Giải pháp tốt nhất là làm cho dữ liệu có thể chuyển đổi và sử dụng trạng thái lưu trữ nhưng do phức tạp, điều này có thể được giảm thiểu bằng cách sử dụng tính năng dụ của các đoạn và quản lý cẩn thận hơn các tài nguyên phân đoạn của chúng tôi để đảm bảo chúng tôi không giữ tham chiếu đến hoạt động cũ/views (nên được thực hiện bằng cách thực hành tốt nhất và để cải thiện hiệu suất). –

0

Theo http://developer.android.com/guide/topics/resources/runtime-changes.html,you hoàn toàn có thể lưu dữ liệu trong đoạn miễn là nó không có liên quan đến các hoạt động, lượt xem, v.v. Các gói thực sự không có nghĩa là đối với một lượng lớn dữ liệu và việc tuần tự hóa chậm, vì vậy một đoạn là lý tưởng cho một lượng lớn dữ liệu.

Bạn không thể khôi phục hoàn toàn trạng thái hoạt động của mình bằng Gói mà hệ thống tiết kiệm cho bạn với cuộc gọi lại onSaveInstanceState() — nó không được thiết kế để mang các đối tượng lớn (như bitmap) và dữ liệu bên trong nó phải được tuần tự hóa sau đó được deserialized, có thể tiêu thụ rất nhiều bộ nhớ và làm cho sự thay đổi cấu hình chậm. Trong tình huống như vậy, bạn có thể làm giảm bớt gánh nặng của việc khởi tạo lại hoạt động của bạn bằng cách giữ lại Phân đoạn khi hoạt động của bạn được khởi động lại do thay đổi cấu hình.Đoạn này có thể chứa các tham chiếu đến các đối tượng stateful mà bạn muốn giữ lại.

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