2016-04-25 45 views
5

Trong ứng dụng tôi đang làm việc trên tôi đang nhìn thấy một rò rỉ bộ nhớ trong DialogFragment và cách duy nhất để sửa chữa nó cho đến nay đã được để loại bỏ tất cả các quan điểm khi DialogFragment bị phá hủy, đây là một điều bình thường phải làm gì? Tôi đang làm việc với một ROM tùy chỉnh vì vậy đã không chắc chắn nếu có thể đó là một cái gì đó để làm với vấn đề này. Có lý do nào KHÔNG loại bỏ tất cả các khung nhìn từ hộp thoại sẽ khiến chúng bị rò rỉ bộ nhớ?DialogFragment rò rỉ bộ nhớ

@Override 
    public void onDestroyView() { 
     if (getView() instanceof ViewGroup) { 
      ((ViewGroup)getView()).removeAllViews(); 
     } 
     super.onDestroyView(); 
    } 
+1

để xác nhận điều đó, bạn cũng nên thử trên điện thoại không bắt nguồn từ –

Trả lời

4

MemoryLeak có thể xảy ra đối với nhiều nguyên nhân, một số nguyên nhân phổ biến:

  • Giữ tham chiếu của đối tượng của bạn (trong trường hợp này thể hiện của DialogFragment của bạn) trong một số lĩnh vực tĩnh.
  • đèo Context để Chủ đề hoặc AsyncTask vì Chủ đề cũng là GC root!
  • Lớp học của bạn có lớp bên trong không tĩnh, trong trường hợp này rò rỉ bộ nhớ xảy ra nếu lớp bên trong liên quan đến gốc GC (ví dụ: nếu lớp bên trong là trường hợp AsyncTask).

Trong trường hợp của bạn, có thể bạn có chế độ xem liên quan đến gốc GC, trong khi chế độ xem đó không thể thu gom rác hộp thoại của bạn giữ chế độ xem cũng không thể thu gom rác.

5

Điều này cũng xảy ra với Ứng dụng của tôi và tôi đã phát hiện rò rỉ bằng Leakcanary.

Điều này xảy ra khi bạn có Hộp thoại với EditText. Nháy mắt của con trỏ, được thực hiện bằng cách sử dụng một cuộc gọi lại không được xử lý đúng cách khi đóng View có chứa EditText. Và nó xảy ra tình cờ theo điều này.

https://code.google.com/p/android/issues/detail?id=188551

Sửa

Và đây là cách những gì tôi làm trước mỗi dialog.dismiss():

editText.setCursorVisible(false); 
dismiss(); 

Hope this helps!