0

在片段中使用在fragment中的簡單應用在片段中存在內存泄漏,根據泄漏應用程序。泄漏的RecyclerView中的內存泄漏通過LeakCanary

Memory Leak snapshot by Leak App

堆棧:

HelloTest.java:

public class HelloTest extends AppCompatActivity { 
    private TestFrag mFrag = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState == null) { 
      mFrag = new TestFrag(); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(android.R.id.content, mFrag) 
        .commit(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     RefWatcher refWatcher = AppClass.getRefWatcher(this); 
     refWatcher.watch(this); 

    } 
} 

片段:

public class TestFrag extends Fragment { 

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

     return view; 
    } 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/comme_rv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

</RelativeLayout> 

通過執行上述應用程序代碼當應用程序退出時發生內存泄漏。 如果相同的代碼被放置在活動而不是片段中,那麼就沒有泄漏。 我做錯了什麼?

回答

0

你不應該在onDestroy方法中創建任何東西。所以,你把你的代碼是這樣的:

public class HelloTest extends AppCompatActivity { 
    private TestFrag mFrag = null; 
    RefWatcher refWatcher; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     refWatcher = AppClass.getRefWatcher(this); 
     refWatcher.watch(this); 
     if (savedInstanceState == null) { 
      mFrag = new TestFrag(); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(android.R.id.content, mFrag) 
        .commit(); 
     } 
    } 

    @Override 
    public void onDestroy() { 

     if(refWatcher!=null){ 
      // destroy refWatcher 
     } 
     super.onDestroy(); 
    } 
} 
+0

感謝您的建議,我已經厭倦了這一點,但問題仍然存在。 – Wasim

+0

請把你的代碼用在onDestroy上。 試試這個: 公共無效onBackPressed(){ 如果(refWatcher == NULL!){// 破壞refWatcher } super.onBackPressed();} – MrTy

+0

我已刪除的onDestroy方法。仍然存在問題 – Wasim