android-Leakcanary使用AppCompatActivity和FragmentStatePagerAdapter显示片段泄漏

android-Leakcanary使用AppCompatActivity和FragmentStatePagerAdapter显示片段泄漏,第1张

概述我已经遇到这个问题已有一段时间了,我真的不知道还能尝试什么.我将Leakcanary卡在了我的项目上,所以我可以强迫自己学习android“正确的方式”,而又不选择会引起内存泄漏的模式..我正在构建一个应用程序,并且将其剥离了很多,但我仍然看到发生这种泄漏.我有一个活动,里面有一个view

我已经遇到这个问题已有一段时间了,我真的不知道还能尝试什么.我将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显示片段泄漏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1120452.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存