2015-09-23 5 views
3

У меня эта проблема некоторое время, и я действительно не знаю, что еще попробовать. Я застрял Leakcanary в своем проекте, поэтому я могу заставить себя научиться android «правильный путь», не поднимая шаблоны, которые вызывают утечку памяти. Я создаю приложение, и я его сильно урезал, и я все еще вижу эта утечка происходит.Leakcanary показывает утечку фрагментов с AppCompatActivity и FragmentStatePagerAdapter

У меня есть активность, которая имеет viewpager внутри и создает 10 фрагментов. Если я включаю устройство все кажется нормально, это пока я не давлю на 'Home', что я получаю следующую утечку памяти:

D/LeakCanary﹕ In com.doesnthaveadomain.leo.calendartracker:1.0:1. 
D/LeakCanary﹕ * com.doesnthaveadomain.leo.calendartracker.MyFragment has leaked: 
D/LeakCanary﹕ * GC ROOT static android.view.WindowManagerGlobal.sDefaultWindowManager 
D/LeakCanary﹕ * references android.view.WindowManagerGlobal.mRoots 
D/LeakCanary﹕ * references java.util.ArrayList.array 
D/LeakCanary﹕ * references array java.lang.Object[].[0] 
D/LeakCanary﹕ * references android.view.ViewRootImpl.mInvalidateOnAnimationRunnable 
D/LeakCanary﹕ * references android.view.ViewRootImpl$InvalidateOnAnimationRunnable.mViews 
D/LeakCanary﹕ * references java.util.ArrayList.array 
D/LeakCanary﹕ * references array java.lang.Object[].[0] 
D/LeakCanary﹕ * references android.support.v4.view.ViewPager.mAdapter 
D/LeakCanary﹕ * references com.doesnthaveadomain.leo.calendartracker.MyAdapter.mCurrentPrimaryItem 
D/LeakCanary﹕ * leaks com.doesnthaveadomain.leo.calendartracker.MyFragment instance 

MainActivity:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 

import java.lang.ref.WeakReference; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     MyAdapter myAdapter = new MyAdapter(getSupportFragmentManager(), this); 
     mViewPager.setAdapter(myAdapter); 
     mViewPager.setCurrentItem(5); 
    } 

} 

class MyAdapter extends FragmentStatePagerAdapter { 

    private int mNumberOfViews; 
    private final WeakReference<AppCompatActivity> mActivityWeakRef; 

    public MyAdapter(FragmentManager fm, 
        AppCompatActivity activity) { 
     super(fm); 

     mActivityWeakRef = new WeakReference<AppCompatActivity>(activity); 
     mNumberOfViews = 10; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     MyFragment myFragment = new MyFragment(); 
     AppCompatActivity activity = mActivityWeakRef.get(); 
     if (activity != null) { 
      MyApp.getRefWatcher(mActivityWeakRef.get()).watch(myFragment); 
     } 
     return myFragment; 
    } 

    @Override 
    public int getCount() { 
     return mNumberOfViews; 
    } 
} 

MainActivity Планировка:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <android.support.design.widget.AppBarLayout 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/toolbar_appbar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true" > 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:theme="@style/AppTheme.Toolbar" 
      app:popupTheme="@style/AppTheme.Toolbar.Popup"> 

     </android.support.v7.widget.Toolbar> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

Фрагмент:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

/** 
* A placeholder fragment containing a simple view. 
*/ 
public class MyFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_test, container, false); 
    } 

} 

Фрагмент макет:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/activity_vertical_margin" 
    android:paddingStart="@dimen/activity_vertical_margin" 
    android:paddingRight="@dimen/activity_vertical_margin" 
    android:paddingEnd="@dimen/activity_vertical_margin" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

</LinearLayout> 

ответ