Xamarin.android 如何在销毁活动时清除片段使用的资源?

Xamarin.android 如何在销毁活动时清除片段使用的资源?,xamarin.android,Xamarin.android,例如,我在片段中添加了TextView,如下所示 var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor adaptor.AddFragmentView((i, v, b) => {

例如,我在片段中添加了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;
var适配器=新的GenericFragmentPagerAdaptor(SupportFragmentManager);//其中,GenericFragementPagerAdaptor是从FragementPagerAdaptor派生的子类
Adapter.AddFragmentView((i,v,b)=>{
var视图=i.Inflate(Resource.Layout.tab,v,false);
textView=新的textView(view.Context);
textView.Text=“Test1”;
view.findviewbyd(Resource.Id.mainFrame).AddView(textView);
返回视图;
如果我正在销毁当前活动意味着,所有与片段相关的资源都应该被清除。我在哪里以及如何才能做到这一点?请任何人建议我。

谢谢

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

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

我的建议是下载一次这个示例,并探索fragment的所有生命周期方法

如果需要任何进一步的帮助,我将不胜感激

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

问题是视图保留了对活动上下文的引用。现在,如果保留了视图,也保留了对该上下文的引用

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

下面的示例演示如何不执行此操作

公共类LeakyFragment扩展了片段{

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的所有引用。一旦片段实例被重新使用,您将被要求在onCreateView上创建新UI。在onDestroyView之后保留UI也没有意义。UI将不会被使用

本例中的修复只是更改onDestroyView()方法

除了保留对视图的引用外,您显然不应该保留对活动(例如,onAttach上的onAttach-clean)或任何上下文(除非是应用程序上下文)的引用。

谢谢

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

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

我的建议是下载一次这个示例,并探索fragment的所有生命周期方法

如果需要任何进一步的帮助,我将不胜感激

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

问题是视图保留了对活动上下文的引用。现在,如果保留了视图,也保留了对该上下文的引用

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

下面的示例演示如何不执行此操作

公共类LeakyFragment扩展了片段{

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的所有引用。一旦片段实例被重新使用,您将被要求在onCreateView上创建新UI。在onDestroyView之后保留UI也没有意义。UI将不会被使用

本例中的修复只是更改onDestroyView()方法


除了保留对视图的引用,您显然不应该保留对活动的引用(例如,onAttach上的onAttach-clean)或任何上下文(除非是应用程序上下文)。

这与其他在C#中不再需要时需要释放的资源有什么不同(我假设它是C#)?解决这些用例的方法是:创建一个实现IDisposable的类,并在
块中使用它,并可能提供一个合适的析构函数。我的意思是,片段中使用的视图就是这里的资源。我尝试过实现IDisposable,但它不起作用,“不起作用”除了Sachin的建议(当类的生命周期状态发生变化时使用类提供的回调/事件)之外,您还可以实现一个
Dispose()
方法,该方法“清除与片段相关的资源”,不管这些是什么(此处的视图)当然,
Dispose()
函数必须在使用
块的
结尾处显式或隐式调用。到底什么不起作用?我能够理解您的解决方案,如果我调用dispose,所使用的资源将被清除。但我的疑问是,我如何才能获得片段中使用的资源或视图?一旦我获得它,我将在dis中清除pose方法或其他销毁方法。一些“资源”可能可以通过正在处理的对象的成员访问(我猜
textView
是一个成员变量?)。如果必须处理
视图
,它是
I.Inflate()的结果
但该结果不会存储在任何地方,也无法在任何地方访问,您的工作就是记住它,例如在您的另一个成员中