
我已经遇到这个问题已有一段时间了,我真的不知道还能尝试什么.我将Leakcanary卡在了我的项目上,所以我可以强迫自己学习android“正确的方式”,而又不选择会引起内存泄漏的模式..我正在构建一个应用程序,并且将其剥离了很多,但我仍然看到发生这种泄漏.
我有一个活动,里面有一个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.sDefaultwindowManagerD/LeakCanary﹕ * references androID.vIEw.WindowManagerGlobal.mRootsD/LeakCanary﹕ * references java.util.ArrayList.arrayD/LeakCanary﹕ * references array java.lang.Object[].[0]D/LeakCanary﹕ * references androID.vIEw.VIEwRootImpl.mInvalIDateOnAnimationRunnableD/LeakCanary﹕ * references androID.vIEw.VIEwRootImpl$InvalIDateOnAnimationRunnable.mVIEwsD/LeakCanary﹕ * references java.util.ArrayList.arrayD/LeakCanary﹕ * references array java.lang.Object[].[0]D/LeakCanary﹕ * references androID.support.v4.vIEw.VIEwPager.mAdapterD/LeakCanary﹕ * references com.doesnthaveadomain.leo.calendartracker.MyAdapter.mCurrentPrimaryItemD/LeakCanary﹕ * leaks com.doesnthaveadomain.leo.calendartracker.MyFragment instance主要活动:
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>解决方法:
与我的另一个问题相同,我在错误的时间初始化了引用监视程序,创建了片段而不是销毁了:https://stackoverflow.com/a/32881096/5278339
总结以上是内存溢出为你收集整理的android-Leakcanary使用AppCompatActivity和FragmentStatePagerAdapter显示片段泄漏全部内容,希望文章能够帮你解决android-Leakcanary使用AppCompatActivity和FragmentStatePagerAdapter显示片段泄漏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)