在我们销毁活动时如何清除片段使用的资源?

时间:2016-09-07 11:01:48

标签: xamarin.android

例如,我在片段中添加了TextView,如下所示。

        var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor

        adaptor.AddFragmentView((i, v, b) => {
            var view = i.Inflate(Resource.Layout.tab, v, false);
            textView = new TextView(view.Context);
            textView.Text = "Test1";
            view.FindViewById<FrameLayout>(Resource.Id.mainFrame).AddView(textView);
            return view;

如果我正在销毁当前活动,则应清除与该片段相关的所有资源。我在哪里以及如何做到这一点?拜托,有人建议我。

1 个答案:

答案 0 :(得分:1)

谢谢,

在销毁活动(onDestroy())之前,将调用片段的生命周期方法onDestroyView()和onDetach()。

onDestroyView() - &gt;告诉片段它的视图正在被销毁,以便它可以清理任何相关的资源。

我的建议是一旦下载这个例子并探索片段的所有生命周期方法。

https://github.com/SilverBayTech/FragmentLifeCycle

如果需要进一步的帮助,我将非常感谢您的帮助。

在带有UI的片段中,您经常将一些视图保存为实例状态以加快访问速度。例如,指向EditText的链接,这样您就不必一直findViewById。

问题是View保留对Activity上下文的引用。现在,如果您保留View,则还会保留对该上下文的引用。

如果上下文仍然有效但是典型的保留情况是重新启动Activity,则没有问题。例如,经常用于屏幕旋转。活动重新创建将创建新的上下文,旧的上下文旨在被垃圾收集。但它现在不能被垃圾收集,因为你的Fragment仍然引用旧的。

以下示例显示了如何不这样做

公共类LeakyFragment扩展了Fragment {

private View mLeak; // retained

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

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

@Override
public void onDestroyView() {
    super.onDestroyView();
    // not cleaning up.
}

}

要解决该问题,您需要在onDestroyView中清除对UI的所有引用。重新使用Fragment实例后,系统会要求您在onCreateView上创建新的UI。在onDestroyView之后保留UI也没有意义。 Ui不会被使用。

此示例中的修复只是更改onDestroyView()方法。

@Override
public void onDestroyView(){
    super.onDestroyView();
    mLeak = null; // now cleaning up!
}

除了保持对Views的引用之外,你显然不应该保留对Activity的引用(例如来自onAttach - on on onDetach)或任何Context(除非它是Application上下文)。