2014-11-10 15 views
5

Tôi có một đoạn thư viện hỗ trợ gửi cuộc gọi mạng và recreate() hoạt động gốc khi nhận được phản hồi mạng cụ thể. Tôi có thể thấy rằng hoạt động này được tạo lại vì tôi có thể thấy số onCreate()onDestroy() được gọi.Các mảnh vỡ không bị hủy khi hoạt động recreate()

Nhưng sau khi hoạt động được tạo lại, đoạn vẫn còn đó và nó đã bị mắc kẹt trong một vòng lặp mà tiếp tục tái tạo và tạo ra các đoạn mới.

Dưới đây là một phần của onCreate() của hoạt động:

if (someLogic()) { 
     fragmentA = new FragmentA(); 
     FragmentUtil.addFragment(getSupportFragmentManager(), fragmentA); 
    } else { 
     fragmentB = new FragmentB(); 
     FragmentUtil.addFragment(getSupportFragmentManager(), fragmentB); 
    } 

FragmentA là một trong những hiện cuộc gọi mạng, và FragmentB là đoạn đó sẽ được hiển thị sau khi recreate(). Khi tôi kiểm tra danh sách các đoạn với getSupportFragmentManager().getFragments() Tôi thấy 1 trường hợp FragmentA và 16 phiên bản của FragmentB.

Câu hỏi của tôi là tại sao điều này xảy ra và làm cách nào để khắc phục sự cố?

+0

Bạn có thể cho biết cách thêm các đoạn và tạo lại hoạt động không? Tôi đoán là bạn phải xóa phân đoạnA trước khi khởi động lại hoạt động nhưng tôi sẽ cần xem mã. Btw tại sao bạn không chỉ cần thay thế fragmentA bằng fragmentB thay vì khởi động lại hoạt động? –

+0

Không phải là câu trả lời cụ thể hay là giải pháp lý tưởng nhưng bạn có thể kiểm tra ngăn xếp phân mảnh và chỉ thêm đoạn mới nếu cần, nếu không bạn có thể thay thế/làm mới đoạn hiện tại – zgc7009

Trả lời

9

Gọi số recreate() về cơ bản sẽ gây ra Activity để thực hiện thay đổi cấu hình. Thay đổi cấu hình khiến cả ActivityFragment giây của chúng bị hủy và được tạo lại. Vì vậy, trên thực tế, Fragment s của bạn sẽ bị hủy khi điều này xảy ra (bạn có thể tự mình xem bằng cách thêm thông báo Log vào phương thức onDestroy của đoạn).

Thực tế là các thay đổi cấu hình khiến các đoạn bị phá hủy và được tạo ra tuy nhiên không có nghĩa là chỉ cần quên các mảnh đã từng tồn tại. FragmentManager sẽ vẫn giữ tham chiếu đến đoạn mới được tạo sau khi thay đổi cấu hình xảy ra.

Một điều bạn có thể làm để ngăn chặn nhiều mảnh vỡ từ được tạo ra là bằng cách làm một cái gì đó như thế này trong của hoạt động của bạn onCreate():

if (savedInstanceState == null) { 
    // The Activity is being created for the first time, so create and 
    // add new fragments. 
} else { 
    // Otherwise, the activity is coming back after being destroyed. 
    // The FragmentManager will restore the old Fragments so we don't 
    // need to create any new ones here. 
} 
+5

. một mảnh trong khi giải trí? Tôi có một thiết lập bố trí chế độ ngày/đêm và tôi đã gặp một số vấn đề nhiều bản sao của đoạn trong bộ nhớ – spy

+0

@spy bạn có thể xóa phân đoạn thủ công trước khi tạo lại Hoạt động, "mFragmentManager.beginTransaction(). Remove (mFragment) .commit(); ". – Xiaozou

1

tôi đã cùng một tình huống như @spy viết, tái tạo lại Activity sau Day/Night chế độ được thay đổi. Activity có bốn Fragments mà họ nhận được khôi phục sau khi Activity.recreate() được gọi, bởi vì FragmentManager lưu chúng dưới dạng @Alex Lockwood đã nêu. Nhưng khôi phục và không thêm Fragments sau khi giải trí không giúp tôi vì một số lý do kiến ​​trúc của dự án, tôi muốn họ biến mất.

Giải pháp là để xóa Fragments từ FragmentManager ngay trước Activity.recreate() được gọi là, trong trường hợp của tôi nó là trong Activity.onStart():

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

Fragment fragmentA = fragmentManager.findFragmentByTag("fragmentATag"); 
if(fragmentA != null) 
    fragmentTransaction.remove(fragment); 
// Find and delete other Fragments 

fragmentTransaction.commit(); // or commitAllowingStateLoss() 

recreate(); 

Bằng cách này bạn sẽ không nhận Fragments khôi phục khi Activity.onCreate() được gọi.

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