2017-02-23 62 views
0

我有一個小部件,它打開一個Fragment,顯示他們的圖片的聯繫人列表。這個片段消耗了大量的內存。在離開片段,記憶依然分配...爲什麼onDestroyView()不釋放我的記憶

public class ListFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {  
     List<Contact> contacts = ContactHandler.getByGroup(group); 

     View view = inflater.inflate(R.layout.contact_list_fragment, container, false); 
     ListView listView = (ListView) view.findViewById(R.id.contact_list); 
     listView.setAdapter(new ContactAdapter(getActivity(), contacts)); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
      ... 
      } 
     }); 
     return view; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
    } 
} 

更新: 我想通了,那剩下的內存大小是相等的,如果不管我用的片段添加或不添加適配器。所以這不是我的listview實現。但是對於一個空的片段來說,> 20MB似乎對我來說很重要。

我該如何告訴活動和片段以釋放他們的記憶?

+0

順便說一下,你的'onDestroyView()'的實現是完全沒有意義的。 –

回答

0

您正在使用依靠自動垃圾收集釋放內存的Java。當內存實際上被垃圾收集(或釋放)時,你無法控制。確保你不要保留對片段的引用,以便最終得到垃圾回收。如果您懷疑內存泄漏,請嘗試使用LeakCanary(https://github.com/square/leakcanary)。

+0

打開碎片之前,應用程序使用3MB,當碎片可見時,它使用高達45MB。關閉Fragment和垃圾收集後,它使用27MB。 – Wookiee

+0

如果您確定運行垃圾收集並且沒有足夠的內存被釋放,那麼您可能會發生內存泄漏並需要對其進行跟蹤。 你不能只是告訴片段釋放一切。事情不這樣。搜索堆棧溢出中的'android memory leak'和Google以獲取更多關於該主題的資源。 LeakCanary是檢查內存泄漏的有用工具,作者在這裏https://realm.io/news/droidcon-ricau-memory-leaks-leakcanary/上有一個很好的技術講座。 – Alan