簡體   English   中英

什么時候可以在android中使用強引用並且這段代碼會泄漏?

[英]When it is ok to use strong references in android and does this code leak?

我不清楚什么時候最好使用WeakReference來避免 android 中的內存泄漏。 例子:
片段中的代碼:

containerView.setDataForDisplay(customer, new CustomListener() {    
      @Override  
      public void buttonClicked(@NonNull Customer customer) {  
                if(handler != null) {
                    handler.buttonClickedForCustomer(customer);  
                }  
            }  
        });  

自定義LinearLayout的代碼

public void setDataForDisplay(List<Customer> customer, CustomListener listener) {  
 // view setup code  

 someView.setOnClickListener( v -> {  
    if(listener != null) {  
       listener.buttonClicked(v.getTag());  
    }  
 });
}  

匿名類CustomListener具有對包含片段的this的引用。
該匿名類作為偵聽器傳遞給包含視圖,該視圖最終會執行回調。

我的問題是這會導致內存泄漏嗎?
listener應該以某種方式保持在WeakReference嗎? 我們如何決定何時可以使用強引用還是弱引用?

不,這不是內存泄漏。

簡化的參考圖可能如下所示:

參考圖

確實,該圖確實包含循環引用,但垃圾收集器完全有能力檢測和解決這種情況。 在系統失去對Fragment引用后,整個圖形將被 GC 處理,這通常是在它從屏幕上消失的時候。

我無法設計出需要WeakReference來防止內存泄漏的情況。 (我不是說它們不存在,我只是想不出一個。)

我將WeakReferences視為高級內存管理任務的工具,這種在一般應用程序開發中很少出現。 像:管理的大型項目,它的確定,如果他們中的一些獲得GC'd(如內存用完)的集合,但你寧願讓他們在RAM中。

IOW:不要留下任何你不需要的參考資料,你應該沒問題。

現代 JVM 有一個非常強大的垃圾收集器。 它通過檢測與 gc 根完全隔離的對象,設法收集甚至循環引用。 您可以在此處閱讀有關此主題的更多信息: 垃圾收集的真正工作原理

通過使用弱引用。 但是,您可以加快 gc 的工作,因為在此對象上的所有強引用都消失后,將立即收集此引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM