Java 从片段调用MainActivity方法或使用单例类调用MainActivity方法,哪种方法更适合防止内存泄漏?

Java 从片段调用MainActivity方法或使用单例类调用MainActivity方法,哪种方法更适合防止内存泄漏?,java,android,android-fragments,memory-leaks,admob,Java,Android,Android Fragments,Memory Leaks,Admob,在我的应用程序中,我有一些片段和子片段。我需要从这些片段的内部调用MainActivity的方法。哪一种做法可以更好地防止内存泄漏 public class MainActivity extends AppCompatActivity { private InterstitialAd mInterstitialAd; .... public void interstitalAd() { clicksCount++; if (clicksCount % 3 == 0) {

在我的应用程序中,我有一些
片段
和子
片段
。我需要从这些
片段的内部调用
MainActivity
的方法。哪一种做法可以更好地防止内存泄漏

public class MainActivity extends AppCompatActivity {

private InterstitialAd mInterstitialAd;

....

public void interstitalAd() {
    clicksCount++;
    if (clicksCount % 3 == 0) {
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }
    }
}
然后在我的
片段中

MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.interstitialAd();
还是为我的插播广告开个单身班

public class Combine {

private static Combine instance;
private static Combine ourInstance = new Combine();
private InterstitialAd mInterstitialAd;
private AdRequest adRequest;
private AtomicLong mIdGenerator = null;
private AtomicLong mIdGeneratorNews = null;

private Combine() {
}

private Combine(Context context) {
    mIdGenerator = new AtomicLong();
    mIdGeneratorNews = new AtomicLong();

    mInterstitialAd = new InterstitialAd(context);
    mInterstitialAd.setAdUnitId("ca-app-pub-21412412421/2324242");
    setupAds();
    requestNewInterstitial();
    mInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdClosed() {
            requestNewInterstitial();
        }
    });
}

public static Combine getInstance() {
    return ourInstance;
}

public static Combine getInstance(Context context) {
    if (instance == null) {
        instance = new Combine(context);
    }
    return instance;
}

private void requestNewInterstitial() {
    mInterstitialAd.loadAd(adRequest);
}

public void go() {
    if (mIdGenerator.incrementAndGet() % 3 == 0) {
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }
    }
}

public void goNews() {
    if (mIdGeneratorNews.incrementAndGet() % 2 == 0) {
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
        }
    }
}

private void setupAds() {
    adRequest = new AdRequest.Builder().build();
}

}
并从任何
片段的内部调用

Combine.getInstance(getActivity()).go();

片段
活动
之间进行通信的推荐方法是使用
侦听器
。要点是,对于任何使用具体的
片段
来实现它的
侦听器
的活动,都必须使用它所需要的方法

下面是一个使用伪
侦听器实现
片段的示例

public class LandingFragment extends BaseFragment {

    private LandingFragmentCallbacks mListener;

    ...

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (LandingFragmentCallbacks) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement LandingFragmentCallbacks");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * LandingFragmentCallbacks is an interface that all the activities that use {@link
     * me.upclose.aether.ui.fragments.LandingFragment} has to implement.         
     */
    public static interface LandingFragmentCallbacks {

        public void onRequestShowLoginFragment();

        public void onSkipLogin();
    }  
}

将attention设置为onAttach和onDetach方法,在连接和分离片段时调用它们。因此,您将强制(避免错误)活动以实现侦听器

,您可以从附加的活动调用片段的方法,但不能从片段调用活动的方法。片段被设计为附着在片段中某个活动或事件的某个位置。要从其连接的位置激活方法,请使用回调设计模式,正如第一个答案所建议的。我按照答案所述做了,但是当屏幕广告弹出时,分配的内存达到24-34 mb,然后在关闭后返回到正常分配的内存,因此它可能是弹出窗口的内存本身。请使用Android Studio中的内存跟踪器了解更多详细信息。每个片段都有一个活动实例,不管你叫不叫它。我会在Interstitalad事件之前先尝试一下锁定和解锁抽屉布局,因为它会贯穿整个应用程序并进行更新you@JohnAndrew您可以在Android Studio中尝试在空项目中创建“带抽屉的活动”,并查看自动生成的代码。或者使用Android Studio界面创建一个新片段,它通过回调为您创建(以及片段、空生成器和静态方法的其他主要技巧来实例化片段),如果ShowInterstitalad是所有应用程序中使用的东西,那么您可以创建一个BaseActivity和BaseFragment来实现这一点(附上实现BaseFragmentListener的BaseActivity)很抱歉回复太慢。它可以正常工作,但只要间隙ad弹出,分配的内存就会达到24~34 mb,当我关闭它时,它就会恢复到正常分配的内存。如果我有任何进一步的疑问,我会处理它并更新你,谢谢你的帮助:)