2013-10-09 19 views
5

Xin chào Chúng tôi đang đối mặt với một vấn đề lạ trong ứng dụng Android của chúng tôi. Trong ứng dụng của chúng tôi, chúng tôi đang lưu trữ tất cả các đối tượng/dữ liệu cần thiết trong một đối tượng chung (được gọi là đối tượng A) khi chúng tôi khởi động ứng dụng (Hoạt động đầu tiên). Chúng tôi đã lưu trữ chính bối cảnh trong đối tượng đó. Bất cứ khi nào chúng ta cần ngữ cảnh trong ứng dụng của chúng tôi, chúng tôi đang nhận được bối cảnh từ đối tượng A và sử dụng nó. Tất cả các trường hợp của nó hoạt động tốt ngoại trừ trường hợp dưới đây.

i) Trong khi ứng dụng của chúng tôi ở chế độ nền, chúng tôi đã chơi một số trò chơi cao cấp. Bây giờ chúng tôi đã quay lại ứng dụng thông qua màn hình thu nhỏ (các ứng dụng gần đây). Đột nhiên, ứng dụng bị hỏng.
ii) Nếu chúng tôi buộc dừng ứng dụng thông qua Cài đặt và quay lại ứng dụng thông qua màn hình thu nhỏ thì cùng một sự cố xảy ra.
Đối tượng trở thành null

Cả hai trường hợp, Object A trở thành null (nó có thể bị xóa bởi GC), vì vậy tất cả các hoạt động phụ thuộc vào đối tượng A nhận ngoại lệ.

Tại sao nó lại xảy ra? Làm cách nào để ngăn GC thu thập đối tượng A? Làm thế nào chúng ta có thể đối phó với lực lượng dừng lại? Vui lòng đưa ra bất kỳ ý tưởng nào.

+0

Bạn không thể buộc GC hoặc hệ thống hủy quá trình của bạn. Bạn nên tìm một cách để tuần tự hóa/deserialize đối tượng của bạn trong trường hợp như vậy. –

+0

Đây có thể là khái niệm quan trọng nhất bạn nên hiểu khi viết ứng dụng Android. http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

Android (trên thực tế, Dalvik) KHÔNG GC đối tượng riêng lẻ trừ khi ứng dụng của bạn đang chạy và không có tham chiếu đến nó. Tôi không biết huyền thoại này bắt đầu từ đâu. ** Ứng dụng ** của bạn có thể bị giết, trong trường hợp đó tất cả bắt đầu từ đầu. Nếu bạn cần lưu trạng thái, sau đó tuần tự hóa bằng cách sử dụng 'onPause()' và/hoặc 'onStop()'. Lưu ý, 'onDestroy()' chỉ hữu ích nếu bạn 'kết thúc()' một hoạt động. BTW, nếu 'ngữ cảnh' mà bạn đang lưu trữ là một ngữ cảnh' Hoạt động', bạn đang làm tất cả sai. – Simon

Trả lời

7

Tại sao nó lại xảy ra?

Các ứng dụng khác cũng cần bộ nhớ để chạy. Nó là không hợp lý để giả định rằng Android sẽ giữ cho dữ liệu của bạn trong bộ nhớ vô thời hạn.

Làm cách nào để ngăn GC thu thập đối tượng A?

Không. Tìm một giải pháp khác cho vấn đề của bạn.

Làm thế nào chúng ta có thể đối phó với lực dừng? Vui lòng đưa ra bất kỳ ý tưởng nào.

Cuối cùng, quyết định là tùy thuộc vào bạn, nhưng đây là một vài lựa chọn chung:

  • Khi dữ liệu được lưu trữ không còn tồn tại, điều này như là một khởi tươi của ứng dụng. Đưa người dùng đến trang đích và bắt đầu trò chơi mới.
  • Giữ nguyên dữ liệu. Tùy thuộc vào những gì bạn đang lưu trữ, SharedPreferences hoặc SQLite có thể là lựa chọn tốt. Xem Storage Options để biết tóm tắt các tùy chọn bộ nhớ của bạn.

Tùy chọn thứ hai rõ ràng sẽ không hoạt động cho Bối cảnh của bạn, nhưng có lẽ tôi sẽ kiến ​​trúc sư một giải pháp khác cho Ngữ cảnh.

2

Bạn nên sử dụng ngữ cảnh ứng dụng cho điều đó! Chỉ cần sử dụng getApplicationContext() trong số Activity của bạn và sử dụng thay thế này. Nếu không, hoạt động của bạn sẽ bị rò rỉ ngay khi hệ thống cần bộ nhớ.

Hoạt động của bạn ở chế độ nền khi nhấn vào nhà, khi sau đó phát videoGames hoặc ứng dụng tiêu thụ bộ nhớ, hoạt động của bạn sẽ được hệ thống giải phóng.

Cố gắng hiểu được Hoạt động Vòng đời để giải quyết này:

enter image description here

Hơn nữa khi nhìn thấy nó trong java "bình thường" đối tượng bọc của mình cho hoạt động này được thu thập bởi GC càng sớm càng eligable của mình cho nó , tức là nó không được tham chiếu bởi bất kỳ đối tượng nào khác nữa. Điều này không thể được ngăn chặn nếu toàn bộ ứng dụng của bạn được giải phóng khi hệ thống cần bộ nhớ. Hãy thử để kiểm tra null trong onResume() và tái tạo lại đối tượng của bạn một lần nữa!

Tôi hy vọng điều này có thể giúp bạn.

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