2013-09-07 82 views
7

Tôi đọc rằng giữ lại phân đoạn bằng ui và tham chiếu trên các chế độ xem có thể gây rò rỉ bộ nhớ. Hơn tôi tạo ra ứng dụng thử nghiệm với mảnh mà tôi lưu trữ một số tài liệu tham khảo về quan điểm và thiết lập setRetaineInstance (true), nhưng một số xoay màn hình không gây ra bất kỳ rò rỉ. MAT nói rằng tôi chỉ có một ví dụ về hoạt động của phụ huynh. Tôi đang làm gì sai? Trong trường hợp nào giữ lại mảnh với ui có thể gây rò rỉ?Tại sao đề xuất không giữ lại đoạn với giao diện người dùng?

RetainInstanceActivity.java

public class RetainInstanceActivity extends FragmentActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(android.R.id.content, RetainFragment.newInstance()) 
       .commit(); 
    } 
}} 

RetainFragment.java

public class RetainFragment extends Fragment { 

private View mLogin; 
private View mPassword; 
private View ImageView; 

public static RetainFragment newInstance() { 
    final RetainFragment fragment = new RetainFragment(); 

    return fragment; 
} 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true);   
} 

@Override 
public View onCreateView(final LayoutInflater inflater, 
     final ViewGroup container, final Bundle savedInstanceState) {  
    final View view = inflater.inflate(R.layout.fragment_retain, container, 
      false); 

    mLogin = view.findViewById(R.id.login); 
    mPassword = view.findViewById(R.id.password); 
    ImageView = view.findViewById(R.id.img); 

    return view; 
} 

}

+0

Bạn đã thấy điều này ở đâu? Ví dụ: – Kerry

+0

[Ở đây] (http://stackoverflow.com/questions/13421945/retained-fragments-with-ui-and-memory-leaks?answertab=votes#tab-top). – Bracadabra

Trả lời

7

Ở đây bạn đang giữ lại tài liệu tham khảo quan điểm mLogin, mPassword và ImageView hoạt động cũ, nhưng họ là ghi đè ngay sau khi xoay, vì onCreateView() sẽ được gọi, vì vậy nếu hoạt động của bạn là hoạt động trước và thay đổi cấu hình xảy ra thì bạn sẽ ổn.

Bạn có thể gặp phải rò rỉ bộ nhớ khi hoạt động của bạn không phải là hoạt động trước, và nói chung bạn không thể biết cách xử lý phân đoạn của mình. Ví dụ, ViewPager có 2 bộ điều hợp khác nhau, một (http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html) đang giữ lại các thể hiện Fragment (chỉ cần gọi onDestroyView()), trong khi cái kia (FragmentStatePagerAdapter) đang phá hủy các thể hiện phân đoạn.

Vì vậy, đoạn của bạn sẽ làm rò rỉ bộ nhớ đáng kể nếu được sử dụng từ FragmentPagerAdapter.

Tôi hy vọng điều này sẽ là ví dụ về các vấn đề tiềm ẩn. Nếu bạn biết những gì bạn đang làm sau đó không có vấn đề gọi setRetaineInstance (true) và không xử lý các khung nhìn.

+0

Cảm ơn bạn đã trả lời, nhưng dường như nó không hoạt động theo cách này. Tôi đã tạo một ứng dụng thử nghiệm với hai bộ điều hợp và một máy nhắn tin với mười trang, nhưng sau khi phân trang đến hết, xoay màn hình và phân trang lại, tôi đã để lại 10 bản phân đoạn cho FragmentPagerAdapter và 2 trường hợp cho FragmentStatePagerAdapter. – Bracadabra

+0

Bạn sẽ phải đặt một tệp ZIP ở đâu đó, với dự án đầy đủ để tôi xem, để xem điều gì đang xảy ra –

+0

Bạn có thể nhận dự án từ [repo] này (https://github.com/Drnkn/RetainInstanceTest). – Bracadabra