18

Tôi có một FragmentActivity (Support Fragments) nơi tôi tạo Fragments theo mã và đưa chúng vào FrameLayouts. Tất cả hoạt động tốt cho đến nay. Bây giờ nếu tôi rời khỏi ứng dụng, mọi thứ đều ổn, miễn là hệ thống không giết hoạt động của tôi (hoặc tôi làm điều đó bằng nút dừng trong DDMS). Nếu điều đó xảy ra không có gì được gọi là và hoạt động của tôi bị giết. onDestroy không được gọi.Những mảnh vỡ còn lại sau khi Activity bị giết và tái tạo

Vì vậy, khi tôi mở lại ứng dụng của mình, tất cả các Phân đoạn vẫn tồn tại và tôi nhận được NullPointerExeptions vì chúng cố gắng thực hiện công việc của mình. Các mảnh vỡ không phải là tồn tại trong trạng thái của ứng dụng vì vậy đó là vấn đề đối với tôi.

Tôi không cần chúng trong backStack vì vậy tôi không đặt chúng ở đó và không thể gọi popBackStack() để loại bỏ chúng.

Làm cách nào tôi có thể đặt lại Trình quản lý phân đoạn của mình trong onCreate() hoặc chỉ cần đảm bảo rằng Phân đoạn cũng bị hủy?

+0

bạn đã tìm ra giải pháp cho điều này chưa? – Henry

Trả lời

0

Không chắc chắn nếu nó là cùng một vấn đề, nhưng một số thời gian trước đây tôi đã có một vấn đề với các mảnh trong một viewpager nơi các phương pháp vòng đời fragment không bao giờ được gọi và vấn đề là với người quản lý fragment.

Vì vậy, hãy thử sử dụng childFragmentManager thay vì supportFragmentManager và xem liệu nó có khắc phục được sự cố của bạn hay không.

+0

Nếu hoạt động của bạn bị giết, onDestroy được gọi. Và tôi khá chắc chắn rằng khi hoạt động của bạn bị giết chết, những mảnh vỡ đi kèm với nó. Điều gì khiến bạn nghĩ rằng Hoạt động của bạn bị giết? Bạn chắc chắn không có gì giữ tài liệu tham khảo cho các mảnh của bạn? – Christine

+0

Vấn đề là onDestroy không được gọi cho chắc chắn. Nhưng khi onCreate được gọi là tôi biết nó đã bị phá hủy. Tất cả các tài liệu tham khảo của tôi đều nằm trong hoạt động bị phá hủy nên không. – Towlie288

+0

Bạn chắc chắn không thể dựa vào onDestroy() để được gọi, và có thể có các tác dụng phụ như quản lý để giữ onDestroy() từ kết thúc. Nó có thể là một mớ hỗn độn –

2

Điều này thực sự có thể bình thường. Thay vì instantiating và phá hủy rất nhiều Fragments, Android có thể được giữ chúng xung quanh. Điều này đặc biệt xảy ra với ViewPagers.

Bạn có đang sử dụng nhiều cuộc gọi hoặc cuộc gọi getActivity() nhận bối cảnh không? Nếu có, hãy kiểm tra cuộc gọi getActivity() bằng cách thực hiện một cái gì đó đơn giản như

Activity activity = getActivity(); 
if (activity == null) 
{ 
    Log.w("activity null!", "This will cause a crash if you access this variable!"); 
} 

Một mẹo khác cần lưu ý cho AsyncTasks. Nếu bạn có bất kỳ điều nào trong số này chạy trong nền, bạn sẽ muốn theo dõi xem Hoạt động có còn sống hay đã chết. Tôi nghĩ rằng có kiểm tra vòng đời đưa vào các phiên bản sau của Android, nhưng bạn cũng có thể giữ một cờ boolean trên onAttach() và onDetach().

3

Đoạn lifecycle của đoạn này tương tự như vòng đời của hoạt động để hệ thống có thể bị giết và tái tạo để tiết kiệm bộ nhớ cho các ứng dụng khác. Điều này có nghĩa là có một cơ chế để lưu và khôi phục trạng thái của đoạn. Bạn nên sử dụng nó.

  • Lưu trạng thái của đoạn trong onSaveInstanceState
  • Khôi phục trạng thái - bó savedState được cung cấp cho các mảnh vỡ trong nhiều phương pháp (onCreate, onCreateView vv)

Nếu nó không thể lưu trạng thái của đoạn (do dữ liệu của nó là động và không thể tuần tự hóa), hãy thử triển khai một số hành vi mặc định cho trạng thái không khởi tạo.

3

Tôi biết điều đó là thực sự muộn nhưng tôi có cùng một vấn đề và tôi thấy câu trả lời ở đây

support FragmentPagerAdapter holds reference to old fragments

và đây

ViewPager and fragments — what's the right way to store fragment's state?

Tôi đoán rằng vấn đề là khi bạn tạo ra các hoạt động bạn tạo ra và lưu các mảnh trong một số danh sách và không phải trong phân đoạn kinh doanh. Khi hoạt động được tạo lại, nó cũng tạo ra một trình quản lý mảnh vỡ nhưng mảnh vỡ sử dụng đoạn đã được tạo ra trước đó. Đó là cách mảnh của bạn trả về null cho getActivity() vì đoạn này là đoạn được tạo ra trước khi bạn đặt ứng dụng ở chế độ nền.

+2

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm kết thúc của tìm kiếm một giải pháp (so với một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+1

Các liên kết đó thực sự giải thích rất chi tiết. Câu trả lời tuyệt vời. – Smeet

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